AutoLogin auf Website via Post - Cookies

  • Antworten:13
  • Bentwortet
kirmac09
  • Forum-Beiträge: 13

13.01.2012, 09:07:01 via Website

Hallo,

habe folgendes Problem.

Möchte mich mit meiner App auf einer Website automatisch einloggen. Das heißt ich klicke auf Button, und Endergebnis sollte sein das der Browser startet und die Website erscheint wo man bereits eingeloggt ist. Wenn es irgendeine andere Lösung als meine bisherige gibt bitte posten!

Zurzeit mach ich das ganze so:

1setContentView(v);
2String data = "username=" + s.getUsername() + "&password="+ s.getPassword();
3v.postUrl("http://elearn3.htl-kaindorf.at/login/index.php", data.getBytes());

Problem ist wenn ich auf den Button drücke passiert folgendes:
-Webview erscheint sendet Post-Befehl an Website!
-Einloggen funktioniert - ist nicht das Problem
-Response kommt zurück und öffnet im Browser - Warum weiß ich nicht!! Ist mir allerdings ganz recht!

Problem: Cookies sind dadurch für die Webview gespeichert und im Browser kommt nur die Loginwebsite mit Meldung: Cookies deaktiviert!

Habe versucht das ganze mit dem Cookiemanager zu lösen:
1CookieSyncManager.createInstance(this);
2 CookieSyncManager.getInstance().sync();
3 CookieManager cookieManager = CookieManager.getInstance();
4 String data = "username=" + s.getUsername() + "&password="
5 + s.getPassword();
6 String cookie =cookieManager.getCookie("http://elearn3.htl-kaindorf.at/login/index.php");
7
8 setContentView(v);
9 String cookieString = cookie;
10 cookieManager.setCookie("http://elearn3.htl-kaindorf.at/", cookieString);
11 CookieSyncManager.getInstance().sync();
12 v.postUrl("http://elearn3.htl-kaindorf.at/login/index.php",
13 data.getBytes());

Funktioniert allerdings nicht!

Hoffe ihr könnt mir helfen das Problem zu lösen, bzw. eine andere Lösung zu finden!

PS: Muss dazu noch sagen dass das ganze ohne Cookiemanager schon funktioniert hat, damals hatte ich aber schon ca. 5h nach einer Lösung gesucht und dadurch könnte das Cookie mit einer anderen Lösung gespeichert worden sein, dadurch hat es dann wahrscheinlich mit dieser Lösung funktioniert, Fakt ist jetzt funktioniert es nicht mehr!

MfG kirmac09

— geändert am 13.01.2012, 09:09:29

Antworten
Felix
  • Forum-Beiträge: 259

13.01.2012, 10:06:18 via Website

Tach!

Möchte mich mit meiner App auf einer Website automatisch einloggen. Das heißt ich klicke auf Button, und Endergebnis sollte sein das der Browser startet und die Website erscheint wo man bereits eingeloggt ist.

Wenn Browser und beliebige andere Anwendungen sich denselben Cookie-Speicher teilen sollten, könnte jede dahergelaufene Anwendung den browserschen Cookie-Speicher auslesen und verändern. Das würde niemand ernsthaft wollen, wenn man sich die Folgen dazu ausmalt.

-Response kommt zurück und öffnet im Browser - Warum weiß ich nicht!! Ist mir allerdings ganz recht!

Das wird bereits im Tutorial Hello Views – Web View geklärt und man findet auch Antworten auf diese Frage, wenn man nach "android webview opens browser" sucht. Ein Link löst immer das Default-Verhalten des Systems aus. Wenn du das unterdrücken willst, musst du einen WebViewClient verwenden, der mindestens shouldOverrideUrlLoading() überschreibt.


Felix.

Antworten
kirmac09
  • Forum-Beiträge: 13

13.01.2012, 13:44:03 via Website

Hi!

Danke für die Antwort.

Also ist es nicht möglich das ganze mit dem Browser zu öffnen und gleichzeitig die Cookies zu behalten!

Habe derweil eine Lösung gefunden, um das ganze in einer WebView anzuzeigen, allerdings habe ich das Problem das wenn ich auf einen Link klicke das erste mal noch alles funktioniert - ich bleibe eingeloggt - das 2. Mal komm ich allerdings wieder zurück zum Anmeldeformular! Wie kann ich das umgehen?

Hier der jetztige Code:

1CookieSyncManager.createInstance(h);
2 CookieManager cookieManager = CookieManager.getInstance();
3 Date dateObj = new Date();
4
5 dateObj.setTime(dateObj.getTime() + 2 * 7 * 24 * 60 * 60 * 1000);
6 String sA = "acc=" + 0;
7 String sL = "lgn=";
8 SimpleDateFormat postFormater = new SimpleDateFormat(
9 "EEE MMM dd yyyy HH:mm:ss zzz");
10 String oD = postFormater.format(dateObj);
11 String cookieString = "logondata=" + sA + "&" + sL
12 + "; expires=" + oD;
13 cookieManager.setCookie(redirURL, cookieString);
14 CookieSyncManager.getInstance().sync();
15
16 // ------------------ WEBVIEW -----------------------//
17
18 mWebView = (WebView) findViewById(R.id.webview1);
19
20 WebSettings webSettings = mWebView.getSettings();
21 webSettings.setSavePassword(true);
22 webSettings.setSaveFormData(true);
23 webSettings.setJavaScriptEnabled(true);
24 webSettings.setSupportZoom(true);
25 webSettings.setDefaultZoom(ZoomDensity.FAR);
26
27 mWebView.setWebViewClient(new WebViewClient() {
28 private WebView views;
29 private String urls;
30
31 public boolean shouldOverrideUrlLoading(WebView view,
32 String url) {
33 // do your handling codes here, which url is the
34 // requested url
35 // probably you need to open that url rather than
36 // redirect:
37 Log.d("CLICK","CLICK");
38 this.views = view;
39 this.urls = url;
40 dialog = ProgressDialog.show(h, "",
41 "Loading. Please wait...", true);
42
43 new Thread(new Runnable() {
44 public void run() {
45 views.loadUrl(urls);
46 while (views.getProgress() < 100) {
47
48 }
49 dialog.dismiss();
50 }
51 }).start();
52
53 return false; // then it is not handled by default
54 // action
55 }
56
57 });
58
59 // ------------------------------ HTTP 4.0 REDIRECT
60 // --------------------------//
61
62 HttpClient httpClient = new DefaultHttpClient();
63 HttpConnectionParams.setConnectionTimeout(
64 httpClient.getParams(), TIMEOUT_MS);
65 HttpConnectionParams.setSoTimeout(httpClient.getParams(),
66 TIMEOUT_MS);
67 HttpPost httpPost = new HttpPost(redirURL);
68 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
69 nameValuePairs.add(new BasicNameValuePair("username", s
70 .getUsername()));
71 nameValuePairs.add(new BasicNameValuePair("password", s
72 .getPassword()));
73 HttpResponse end = null;
74 endResult = null;
75
76 try {
77 httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
78 HttpResponse response = httpClient.execute(httpPost);
79 end = response;
80 } catch (Exception e) {
81 // TODO Auto-generated catch block
82 e.printStackTrace();
83 }
84
85 BasicResponseHandler myHandler = new BasicResponseHandler();
86
87 try {
88 endResult = myHandler.handleResponse(end);
89 } catch (HttpResponseException e) {
90 // TODO Auto-generated catch block
91 e.printStackTrace();
92 } catch (IOException e) {
93 // TODO Auto-generated catch block
94 e.printStackTrace();
95 }
96
97 mWebView.loadData(endResult, "text/html", "utf-8");

MfG kirmac09

Antworten
Felix
  • Forum-Beiträge: 259

13.01.2012, 15:37:34 via Website

Tach!

Also ist es nicht möglich das ganze mit dem Browser zu öffnen und gleichzeitig die Cookies zu behalten!

Anders formuliert wird ein Schuh draus: Es ist nicht möglich, dem Browser Cookies unterzuschieben.

Habe derweil eine Lösung gefunden, um das ganze in einer WebView anzuzeigen, allerdings habe ich das Problem das wenn ich auf einen Link klicke das erste mal noch alles funktioniert - ich bleibe eingeloggt - das 2. Mal komm ich allerdings wieder zurück zum Anmeldeformular!

Es gibt bei HTTP keinen Zustand „eingeloggt“. Stattdessen sendest du mit jedem Request Authentifizierungsinformationen mit. Das kann einerseits HTTP-Authentifizierung sein oder eine eindeutige Session-ID, anhand derer der Server den Client wiedererkennt. Wenn du also eine Antwort für nicht Authentifizierte bekommst, fehlt dem Server irgendwas, um dich zu erkennen.

Wie kann ich das umgehen?

Du kannst natürlich auf gut Glück irgendwelche Maßnahmen probieren, aber zielsicherer ist es, vor dem Lösungsversuch erstmal die Ursache des Problems zu ermitteln. Also schau genau nach (Debugging!), an welcher Stelle Wunsch und Wirklichkeit nicht mehr übereinstimmen. Wenn du dir dann nicht erklären kannst, wie das zustande kommt, dann beschreib möglichst exakt, was an welcher Stelle erwartet wird und was kommt.


Felix.

Antworten
kirmac09
  • Forum-Beiträge: 13

15.01.2012, 16:54:00 via Website

Hi,

Es gibt bei HTTP keinen Zustand „eingeloggt“. Stattdessen sendest du mit jedem Request Authentifizierungsinformationen mit. Das kann einerseits HTTP-Authentifizierung sein oder eine eindeutige Session-ID, anhand derer der Server den Client wiedererkennt. Wenn du also eine Antwort für nicht Authentifizierte bekommst, fehlt dem Server irgendwas, um dich zu erkennen.

Das mag ja schon sein, er erkennt den Client aber mithilfe der Cookies wieder, wenn er das nicht tut, liegt das Problem bei den Cookies, bzw. bei der Webview wenn diese bei einem Klick eine neue Session aufmacht, und die Cookies nicht mehr da sind! Tut die WebView das?

Du kannst natürlich auf gut Glück irgendwelche Maßnahmen probieren, aber zielsicherer ist es, vor dem Lösungsversuch erstmal die Ursache des Problems zu ermitteln. Also schau genau nach (Debugging!), an welcher Stelle Wunsch und Wirklichkeit nicht mehr übereinstimmen. Wenn du dir dann nicht erklären kannst, wie das zustande kommt, dann beschreib möglichst exakt, was an welcher Stelle erwartet wird und was kommt.

Ja, ich dachte nur dass mein Problem gar nicht so komplex ist sondern nur ein ganz offensichtlicher Fehler eintritt. Dachte wenn da jemand über den Code schaut, könnte er diesen sicher finden. Wenn nicht lasst sich das ganz genaue Debugging eh nicht vermeiden!

Hab das ganze eh schon so lange hinausgeschoben wie es geht, aber jetzt ist mein Programm wieder soweit dass alles andere "erledigt ist" und das an der Reihe ;)

Das heißt, macht die Webview eine neue Session auf wenn man wo raufklickt (auch bei shouldOverrideURLLoading)?
Mach ich irgendetwas bei den Cookies falsch?

Lg kirmac09

Antworten
Felix
  • Forum-Beiträge: 259

15.01.2012, 17:38:07 via Website

Tach!

Wenn du also eine Antwort für nicht Authentifizierte bekommst, fehlt dem Server irgendwas, um dich zu erkennen.
Das mag ja schon sein, er erkennt den Client aber mithilfe der Cookies wieder, wenn er das nicht tut, liegt das Problem bei den Cookies, bzw. bei der Webview wenn diese bei einem Klick eine neue Session aufmacht, und die Cookies nicht mehr da sind! Tut die WebView das?

Die WebView sendet Requests, mit Parametern, mit Cookies oder auch ohne. Sessions sind etwas serverseitiges. Der Client schickt lediglich eine Session-ID mit. Oder auch nicht.

Ja, ich dachte nur dass mein Problem gar nicht so komplex ist sondern nur ein ganz offensichtlicher Fehler eintritt. Dachte wenn da jemand über den Code schaut, könnte er diesen sicher finden. Wenn nicht lasst sich das ganz genaue Debugging eh nicht vermeiden!

Ich erkläre gern, was das Problem ist, wenn du genau schilderst, was passiert und was stattdessen hätte passieren sollen. Je detaillierter du das Problem schilderst, desto genauer kann ich antworten. Debugging ist aufwendig, gehört aber zum Programmieren dazu, wie der Schlaf zum Leben. Es bringt dir nichts, wenn ich für dich das Debugging übernehme, besonders da der Code nicht nachvollziehbar ist. Er fängt mitten im Block an schon mit einer Variable (h) an, von der weder Typ noch Initialisierung bekannt ist. Das kann schon der Fehler sein, oder es ist irgendwas anders.

Das heißt, macht die Webview eine neue Session auf wenn man wo raufklickt (auch bei shouldOverrideURLLoading)?
Mach ich irgendetwas bei den Cookies falsch?

Kontrollier doch erstmal, was der Server bekommt, beziehungsweise was ihm fehlt. Vielleicht ist es der Cookie. Wenn es hart kommt, wirst du auch noch Network-Sniffing betreiben müssen, um den Inhalt der ausgetauschten Pakete zu analysieren. Du kannst auch abseits der eigentlichen Baustelle ein neues Projekt erstellen, in dem du einfach nur das Cookie-Senden probierst. Am besten mit einer Server-Anwendung zusammen, die auch nur minimalistisch Cookie-Handling enthält.


Felix.

— geändert am 15.01.2012, 17:45:06

Antworten
kirmac09
  • Forum-Beiträge: 13

15.01.2012, 18:29:05 via Website

Okay,

zuerst einmal was passieren soll: Die Webview soll man wie einen Browser verwenden können, wenn man sie startet sollte sich die App automatisch einloggen, tut sie auch, und auch wenn man irgendwo klickt, sollte man eingeloggt bleiben.

Das Problem ist, das sobald man auf irgendwo klickt man nicht mehr eingeloggt ist, es kommt aber keine Fehlermeldung wie z.B: Passwort falsch, Cookies deaktiviert etc. !

Es ist also so als hätte der Login Prozess davor nie stattgefunden.

Die Authentifikation funktioniert aber beim ersten Mal, also muss es irgentetwas damit zutun haben, weil bei einem Klick nur mehr dieser Code ausgeführt wird:

1mWebView.setWebViewClient(new WebViewClient() {
2 private WebView views;
3 private String urls;
4
5 public boolean shouldOverrideUrlLoading(WebView view,
6 String url) {
7 // do your handling codes here, which url is the
8 // requested url
9 // probably you need to open that url rather than
10 // redirect:
11 Log.d("CLICK", "CLICK");
12 this.views = view;
13 this.urls = url;
14 dialog = ProgressDialog.show(Elearn.this, "",
15 "Loading. Please wait...", true);
16
17 new Thread(new Runnable() {
18 public void run() {
19 views.loadUrl(urls);
20 while (views.getProgress() < 100) {
21
22 }
23 dialog.dismiss();
24 }
25 }).start();
26
27 return false; // then it is not handled by default
28 // action
29 }


Und hier die ganze Activity:
1package kimrac09.htl.kaindorf;
2
3import java.io.IOException;
4import java.text.SimpleDateFormat;
5import java.util.ArrayList;
6import java.util.Date;
7import java.util.List;
8
9import org.apache.http.HttpResponse;
10import org.apache.http.NameValuePair;
11import org.apache.http.client.HttpClient;
12import org.apache.http.client.HttpResponseException;
13import org.apache.http.client.entity.UrlEncodedFormEntity;
14import org.apache.http.client.methods.HttpPost;
15import org.apache.http.impl.client.BasicResponseHandler;
16import org.apache.http.impl.client.DefaultHttpClient;
17import org.apache.http.message.BasicNameValuePair;
18import org.apache.http.params.HttpConnectionParams;
19
20import android.app.Activity;
21import android.app.ProgressDialog;
22import android.content.Intent;
23import android.os.Bundle;
24import android.os.StrictMode;
25import android.util.Log;
26import android.view.View;
27import android.webkit.CookieManager;
28import android.webkit.CookieSyncManager;
29import android.webkit.WebSettings;
30import android.webkit.WebView;
31import android.webkit.WebViewClient;
32import android.webkit.WebSettings.ZoomDensity;
33
34public class Elearn extends Activity {
35
36 private static final int TIMEOUT_MS = 3000;
37 private WebView mWebView;
38 private static final String redirURL = "MEINEURL/index.php";
39 private ProgressDialog dialog;
40 private String endResult;
41 private String username = "";
42 private String password = "";
43
44 @Override
45 protected void onCreate(Bundle savedInstanceState) {
46 // TODO Auto-generated method stub
47 super.onCreate(savedInstanceState);
48
49 Bundle b = getIntent().getExtras();
50 username = b.getString("username");
51 password = b.getString("password");
52
53 setContentView(R.layout.webview);
54 dialog = ProgressDialog.show(this, "", "Loading. Please wait...", true);
55 new Thread(new Runnable() {
56 public void run() {
57 // ------------------ COOKIES -----------------------//
58 CookieSyncManager.createInstance(Elearn.this);
59 CookieManager cookieManager = CookieManager.getInstance();
60 Date dateObj = new Date();
61
62 dateObj.setTime(dateObj.getTime() + 2 * 7 * 24 * 60 * 60 * 1000);
63 String sA = "acc=" + 0;
64 String sL = "lgn=";
65 SimpleDateFormat postFormater = new SimpleDateFormat(
66 "EEE MMM dd yyyy HH:mm:ss zzz");
67 String oD = postFormater.format(dateObj);
68 String cookieString = "logondata=" + sA + "&" + sL
69 + "; expires=" + oD;
70 cookieManager.setCookie(redirURL, cookieString);
71 CookieSyncManager.getInstance().sync();
72
73 // ------------------ WEBVIEW -----------------------//
74
75 mWebView = (WebView) findViewById(R.id.webview1);
76
77 WebSettings webSettings = mWebView.getSettings();
78 webSettings.setSavePassword(true);
79 webSettings.setSaveFormData(true);
80 webSettings.setJavaScriptEnabled(true);
81 webSettings.setSupportZoom(true);
82 webSettings.setDefaultZoom(ZoomDensity.FAR);
83
84 mWebView.setWebViewClient(new WebViewClient() {
85 private WebView views;
86 private String urls;
87
88 public boolean shouldOverrideUrlLoading(WebView view,
89 String url) {
90 // do your handling codes here, which url is the
91 // requested url
92 // probably you need to open that url rather than
93 // redirect:
94 Log.d("CLICK", "CLICK");
95 this.views = view;
96 this.urls = url;
97 dialog = ProgressDialog.show(Elearn.this, "",
98 "Loading. Please wait...", true);
99
100 new Thread(new Runnable() {
101 public void run() {
102 views.loadUrl(urls);
103 while (views.getProgress() < 100) {
104
105 }
106 dialog.dismiss();
107 }
108 }).start();
109
110 return false; // then it is not handled by default
111 // action
112 }
113
114 });
115
116 // ------------------------------ HTTP 4.0 REDIRECT
117 // --------------------------//
118
119 HttpClient httpClient = new DefaultHttpClient();
120 HttpConnectionParams.setConnectionTimeout(
121 httpClient.getParams(), TIMEOUT_MS);
122 HttpConnectionParams.setSoTimeout(httpClient.getParams(),
123 TIMEOUT_MS);
124 HttpPost httpPost = new HttpPost(redirURL);
125 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
126 nameValuePairs
127 .add(new BasicNameValuePair("username", username));
128 nameValuePairs
129 .add(new BasicNameValuePair("password", password));
130 HttpResponse end = null;
131 endResult = null;
132
133 try {
134 httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
135 HttpResponse response = httpClient.execute(httpPost);
136 end = response;
137 } catch (Exception e) {
138 // TODO Auto-generated catch block
139 e.printStackTrace();
140 }
141
142 BasicResponseHandler myHandler = new BasicResponseHandler();
143
144 try {
145 endResult = myHandler.handleResponse(end);
146 } catch (HttpResponseException e) {
147 // TODO Auto-generated catch block
148 e.printStackTrace();
149 } catch (IOException e) {
150 // TODO Auto-generated catch block
151 e.printStackTrace();
152 }
153
154 mWebView.loadData(endResult, "text/html", "utf-8");
155 while (mWebView.getProgress() < 100) {
156
157 }
158 dialog.dismiss();
159 }
160 }).start();
161
162 }
163
164 public void onBack(View view) {
165 Intent intent = new Intent();
166 setResult(RESULT_OK, intent);
167 intent.setClass(this, HTLKaindorf.class);
168 finish();
169 }
170}
Lg

— geändert am 15.01.2012, 18:40:08

Antworten
Felix
  • Forum-Beiträge: 259

15.01.2012, 18:40:54 via Website

Tach!

zuerst einmal was passieren soll: Die Webview soll man wie einen Browser verwenden können, wenn man sie startet sollte sich die App automatisch einloggen, tut sie auch, und auch wenn man irgendwo klickt, sollte man eingeloggt bleiben. …

Das ist viel zu grob. Beschreib es aus der Sicht deines Codes. Such die Stelle, an der dein Code (zum Beispiel ein Funktionsaufruf) etwas anderes liefert als du dir vorgestellt hast.

Es ist also so als hätte der Login Prozess davor nie stattgefunden.

Wenn es denn ein nicht gesendeter Cookie ist, dann verfolge seinen Weg. Der Server sendet ihn dir zu und du musst ihn beim nächsten Request mitsenden. Wann ist er noch da, wann nicht mehr. Du kannst mit dem Debugger auch Inhalte von Objekten ansehen, die zum Android-Ökosystem gehören (zum Beispiel CookieManager)

Ich vermute das liegt daran:

Schnapp dir den Debugger, prüf deine Vermutung!


Felix.

Antworten
kirmac09
  • Forum-Beiträge: 13

15.01.2012, 18:57:59 via Website


Das ist viel zu grob. Beschreib es aus der Sicht deines Codes. Such die Stelle, an der dein Code (zum Beispiel ein Funktionsaufruf) etwas anderes liefert als du dir vorgestellt hast.
Habe ich gemacht und im vorherigen Post gepostet

Wenn es denn ein nicht gesendeter Cookie ist, dann verfolge seinen Weg. Der Server sendet ihn dir zu und du musst ihn beim nächsten Request mitsenden. Wann ist er noch da, wann nicht mehr. Du kannst mit dem Debugger auch Inhalte von Objekten ansehen, die zum Android-Ökosystem gehören (zum Beispiel CookieManager)
Ich habe es probiert aber ich habe keine Ahnung wie ich im Debug mode den CookieManager finden soll, bzw. wie ich den Cookie verfolgen kann.

Wird ein Cookie automatisch wieder mitgesendet? Wenn ja, ist der Cookie nicht das Problem wenn nein schon!

Ansonsten ruft der Browser nach Klick die Seite auf, und erkennt das keiner mehr eingeloggt ist, liegt zu 100% am Cookie, und leitet dann auf die Login-Seite weiter.

Es liegt zu 100% an der angegebenen Stelle, die Frage ist nur wie sende ich den Cookie wieder mit?

Bzw. die Cookies werden meines wissen ja von der Website abgerufen! Also muss ich ja nichts mitsenden.

Lg

— geändert am 15.01.2012, 19:07:32

Antworten
kirmac09
  • Forum-Beiträge: 13

15.01.2012, 20:33:53 via Website

Sorry für den Doppelpost!

Ich habe eine Lösung gefunden!

Problem dabei, ich habe keine Ahnung warum es jetzt funktioniert ob es jetzt weiterhin funktioniert etc.

Hoffe es kann mich jemand von euch helfen, was den Grund angeht (Vor allem auch damit ich den Code bereinigen kann, weil ich habe das Gefühl das 90% nicht gebraucht werden!!)

Das einzige was ich geändert habe ist das:

mWebView.loadData(endResult, "text/html", "utf-8");

GEÄNDERT ZU:

String postData = "username=" + username + "&password="+ password;
mWebView.postUrl("http://elearn3.htl-kaindorf.at/login/index.php",EncodingUtils.getBytes(postData, "utf-8"));

Hoffe es kann mich jemand aufklären!



Hier der gesamte code:

1package kimrac09.htl.kaindorf;
2
3import java.io.IOException;
4import java.text.SimpleDateFormat;
5import java.util.ArrayList;
6import java.util.Date;
7import java.util.List;
8
9import org.apache.http.HttpResponse;
10import org.apache.http.NameValuePair;
11import org.apache.http.client.HttpClient;
12import org.apache.http.client.HttpResponseException;
13import org.apache.http.client.entity.UrlEncodedFormEntity;
14import org.apache.http.client.methods.HttpPost;
15import org.apache.http.impl.client.BasicResponseHandler;
16import org.apache.http.impl.client.DefaultHttpClient;
17import org.apache.http.message.BasicNameValuePair;
18import org.apache.http.params.HttpConnectionParams;
19import org.apache.http.util.EncodingUtils;
20
21import android.app.Activity;
22import android.app.ProgressDialog;
23import android.content.Intent;
24import android.os.Bundle;
25import android.os.StrictMode;
26import android.util.Log;
27import android.view.View;
28import android.webkit.CookieManager;
29import android.webkit.CookieSyncManager;
30import android.webkit.WebSettings;
31import android.webkit.WebView;
32import android.webkit.WebViewClient;
33import android.webkit.WebSettings.ZoomDensity;
34
35public class Elearn extends Activity {
36
37 private static final int TIMEOUT_MS = 3000;
38 private WebView mWebView;
39 private static final String redirURL = "http://elearn3.htl-kaindorf.at/login/index.php";
40 private ProgressDialog dialog;
41 private String endResult;
42 private String username = "";
43 private String password = "";
44
45 @Override
46 protected void onCreate(Bundle savedInstanceState) {
47 // TODO Auto-generated method stub
48 super.onCreate(savedInstanceState);
49
50 Bundle b = getIntent().getExtras();
51 username = b.getString("username");
52 password = b.getString("password");
53
54 setContentView(R.layout.webview);
55 dialog = ProgressDialog.show(this, "", "Loading. Please wait...", true);
56 new Thread(new Runnable() {
57 public void run() {
58 // ------------------ COOKIES -----------------------//
59 CookieSyncManager.createInstance(Elearn.this);
60 CookieManager cookieManager = CookieManager.getInstance();
61 Date dateObj = new Date();
62
63 dateObj.setTime(dateObj.getTime() + 2 * 7 * 24 * 60 * 60 * 1000);
64 String sA = "acc=" + 0;
65 String sL = "lgn=";
66 SimpleDateFormat postFormater = new SimpleDateFormat(
67 "EEE MMM dd yyyy HH:mm:ss zzz");
68 String oD = postFormater.format(dateObj);
69 String cookieString = "logondata=" + sA + "&" + sL
70 + "; expires=" + oD;
71 cookieManager.setCookie(redirURL, cookieString);
72 CookieSyncManager.getInstance().sync();
73
74 // ------------------ WEBVIEW -----------------------//
75
76 mWebView = (WebView) findViewById(R.id.webview1);
77
78 WebSettings webSettings = mWebView.getSettings();
79 webSettings.setSavePassword(true);
80 webSettings.setSaveFormData(true);
81 webSettings.setJavaScriptEnabled(true);
82 webSettings.setSupportZoom(true);
83 webSettings.setDefaultZoom(ZoomDensity.FAR);
84
85 mWebView.setWebViewClient(new WebViewClient() {
86 private WebView views;
87 private String urls;
88
89 public boolean shouldOverrideUrlLoading(WebView view,
90 String url) {
91 // do your handling codes here, which url is the
92 // requested url
93 // probably you need to open that url rather than
94 // redirect:
95 this.views = view;
96 this.urls = url;
97
98 new Thread(new Runnable() {
99 public void run() {
100 views.loadUrl(urls);
101
102 }
103 }).start();
104
105 return false; // then it is not handled by default
106 // action
107 }
108
109 });
110
111 // ------------------------------ HTTP 4.0 REDIRECT
112 // --------------------------//
113
114 HttpClient httpClient = new DefaultHttpClient();
115 HttpConnectionParams.setConnectionTimeout(
116 httpClient.getParams(), TIMEOUT_MS);
117 HttpConnectionParams.setSoTimeout(httpClient.getParams(),
118 TIMEOUT_MS);
119 HttpPost httpPost = new HttpPost(redirURL);
120 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
121 nameValuePairs
122 .add(new BasicNameValuePair("username", username));
123 nameValuePairs
124 .add(new BasicNameValuePair("password", password));
125 HttpResponse end = null;
126 endResult = null;
127
128 try {
129 httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
130 HttpResponse response = httpClient.execute(httpPost);
131 end = response;
132 } catch (Exception e) {
133 // TODO Auto-generated catch block
134 e.printStackTrace();
135 }
136
137 BasicResponseHandler myHandler = new BasicResponseHandler();
138
139 try {
140 endResult = myHandler.handleResponse(end);
141 } catch (HttpResponseException e) {
142 // TODO Auto-generated catch block
143 e.printStackTrace();
144 } catch (IOException e) {
145 // TODO Auto-generated catch block
146 e.printStackTrace();
147 }
148
149 // mWebView.loadData(endResult, "text/html", "utf-8");
150 String postData = "username=" + username + "&password="
151 + password;
152 mWebView.postUrl(
153 "URL/login.php",
154 EncodingUtils.getBytes(postData, "utf-8"));
155
156
157 dialog.dismiss();
158 }
159 }).start();
160
161 }
162
163 public void onBack(View view) {
164 Intent intent = new Intent();
165 setResult(RESULT_OK, intent);
166 intent.setClass(this, HTLKaindorf.class);
167 finish();
168 }
169}

Lg kirmac09

— geändert am 15.01.2012, 21:19:16

Antworten
Felix
  • Forum-Beiträge: 259

15.01.2012, 20:44:36 via Website

Tach!


Das ist viel zu grob. Beschreib es aus der Sicht deines Codes. Such die Stelle, an der dein Code (zum Beispiel ein Funktionsaufruf) etwas anderes liefert als du dir vorgestellt hast.
Habe ich gemacht und im vorherigen Post gepostet

Ich sehe nur einen Haufen Code, aber keine Beschreibung mit einer Genauigkeit à la: „In Zeile 0815 liefert der Funktionsaufruf ein ABC, aber eigentlich erwarte ich XYZ.“ Ein „irgendwo in diesem Berg muss der Fehler stecken“ hilft beim Fehlersuchen ziemlich wenig.

Wird ein Cookie automatisch wieder mitgesendet? Wenn ja, ist der Cookie nicht das Problem wenn nein schon!

„Automatisch“ gibt es nicht. Um irgendeinen Effekt zu erreichen, muss das immer irgendein Stück Code erledigen. In dem Fall ist der CookieManager für die Verwaltung der Cookies zuständig. Der ist als Singleton ausgeführt. Über sein getInstance() bekommst du eine Instanz und die WebView (oder was im Hintergrund den Request bearbeitet) ebenfalls. Das heißt, du kannst mit dem CookieManager arbeiten und deine WebView arbeitet ebenfalls damit und sendet die zur URL passenden Cookies.

Ich sehe in deinem Code, dass du händisch einen Cookie erstellst. Das kann man machen, wenn man ganz genau weiß, dass der Server diesen Cookie erwartet und man ihm ihn unaufgefordert zusenden will. Aber eigentlich widerspricht das dem normalen Umgang mit Cookies. Üblicherweise sendet der Server den Cookie in einer Response und der Client muss ihn beim nächsten Request wieder mitsenden. Wenn die Response bei dir eingetroffen ist, muss der CookieManager also den vom Server gesendeten Cookie kennen. Vielleicht muss man dem CookieManager vorher noch sagen, dass er Cookies akzeptieren soll (setAcceptCookie()), die Doku ist da leider etwas schweigsam, was der Default-Wert dafür ist.

Ich habe es probiert aber ich habe keine Ahnung wie ich im Debug mode den CookieManager finden soll, bzw. wie ich den Cookie verfolgen kann.

Du holst dir doch eine Instanz vom CookieManager und die kannst du Variables-View der Debug-Perspektive von Eclipse untersuchen. Du kannst auch Expressions (im gleichnamigen View) abarbeiten lassen, also von der CookieManager-Instanz mit getCookie() gezielt die von deiner URL erbitten, wenn beim Durchsuchen der Instanz nichts gescheites rauskommt.


Felix.

Antworten
kirmac09
  • Forum-Beiträge: 13

15.01.2012, 20:57:49 via Website

Danke für deine Antwort.

Ich werde mir das ganze mit dem CookieManager mal anschauen.

Aus irgendeinem Grund funktioniert es jetzt. Bezüglich des manuell erstellten Cookies, der Code stammt ursprünglich nicht von mir, und ich hab ihn nur abgewandelt, aufjedenfall hab ich im Punkt Cookies nichts geändert.

Im Endeffekt ist das der Code den ich benötige:

1import org.apache.http.util.EncodingUtils;
2
3import android.app.Activity;
4import android.os.Bundle;
5import android.webkit.CookieManager;
6import android.webkit.CookieSyncManager;
7import android.webkit.WebSettings;
8import android.webkit.WebView;
9import android.webkit.WebViewClient;
10import android.webkit.WebSettings.ZoomDensity;
11
12public class ElearnTest extends Activity {
13
14 private WebView mWebView;
15 private String username = "";
16 private String password = "";
17
18 @Override
19 protected void onCreate(Bundle savedInstanceState) {
20 // TODO Auto-generated method stub
21 super.onCreate(savedInstanceState);
22
23 // ------------------ READ -----------------------//
24 username = "USERNAME";
25 password = "PASSWORD";
26
27 // ------------------ DISPLAY -----------------------//
28 setContentView(R.layout.webview);
29
30 // ------------------ COOKIES -----------------------//
31 CookieSyncManager.createInstance(ElearnTest.this);
32 CookieSyncManager.getInstance().sync();
33
34 // ------------------ WEBVIEW -----------------------//
35 mWebView = (WebView) findViewById(R.id.webview1);
36
37 WebSettings webSettings = mWebView.getSettings();
38 webSettings.setSavePassword(true);
39 webSettings.setSaveFormData(true);
40 webSettings.setJavaScriptEnabled(true);
41 webSettings.setSupportZoom(true);
42 webSettings.setDefaultZoom(ZoomDensity.FAR);
43
44 mWebView.setWebViewClient(new WebViewClient() {
45 private WebView views;
46 private String urls;
47
48 public boolean shouldOverrideUrlLoading(WebView view, String url) {
49 this.views = view;
50 this.urls = url;
51 views.loadUrl(urls);
52 return false; // then it is not handled by default
53 }
54 });
55
56 // ------------- HTTP 4.0 REDIRECT--------------------------//
57 String postData = "username=" + username + "&password=" + password;
58 mWebView.postUrl("URL/login.php",
59 EncodingUtils.getBytes(postData, "utf-8"));
60 }
61}

Lg kirmac09

— geändert am 15.01.2012, 21:18:37

Antworten
Felix
  • Forum-Beiträge: 259

15.01.2012, 21:28:30 via Website

Tach!

Aus irgendeinem Grund funktioniert es jetzt. … Im Endeffekt ist das der Code den ich benötige:

Ich sehe, da ist jetzt gar kein CookieManger mehr drin (nur der …Sync…, wobei man den eventuell auch weglassen kann). Das ist nicht verkehrt, denn wenn man ihn gar nicht anfasst, arbeitet er einfach so im Hintergrund, nimmt die Cookies der Server entgegen (setAcceptCookie() ist gemäß meinem Versuch angeschaltet) und sendet sie wieder zurück – also das übliche Verhalten wie ein Browser, an dem keiner was verstellt hat.


Felix.

Antworten
kirmac09
  • Forum-Beiträge: 13

15.01.2012, 22:32:53 via Website

Ja, funktioniert so perfekt!

Aus irgendeinem Grund funktioniert allerding ohne dem Sync Aufruf mit dem CookieManager nicht!

Einziges Problem was ich noch habe, ist das anzeigen des Ladezustandes mit Progressdialog. Aber das bekomm ich auch noch hin. ;)

Vielen Dank für deine Hilfe,

kirmac09

Antworten