Przeszedłem przez różne tutoriale i tę stronę, ale nie mogłem znaleźć odpowiedniego rozwiązania. Z drugiej strony widziałem aplikacje logujące się na stronach internetowych i żądające dalszych informacji, więc jestem pewien, że istnieje sposób, aby to zadziałało, ale może moje podejście jest złe.Android: zaloguj się na stronie internetowej i zachowaj sesję/cookie za pomocą DefaultHttpClient
Oto, co próbuję zrobić: chcę zalogować się do witryny, która wymaga uwierzytelnienia użytkownika, a następnie czytać i analizować witryny, które są dostępne tylko po zalogowaniu użytkownika. Problem: po wpisaniu poświadczeń do na stronie, otrzymuję plik cookie, który nie wydaje się być zachowany w moim HttpClient, mimo że dokumenty sugerują, że właśnie to powinno się stać.
Oto niektóre z moich kodu:
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpPost httpost = new HttpPost(LOGIN_URL);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair(USER_FIELD, login));
nvps.add(new BasicNameValuePair(PASS_FIELD, pw));
nvps.add(new BasicNameValuePair(REMEMBERME, "on"));
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
HttpResponse response = httpclient.execute(httpost);
HttpEntity entity = response.getEntity();
if (entity != null) {
entity.consumeContent();
}
List<Cookie> cookies = httpclient.getCookieStore().getCookies();
Kiedy wyjście I zawartość "cookies", wszystko wydaje się w porządku (I odbieranie sesji):
- [version: 0][name: ASP.NET_SessionId][value: xxx][domain: xxx][path: /][expiry: null]
Jak zrozumiałem, plik cookie/sesja zostanie zachowany i użyty w moim HttpClient, o ile go nie zamknę.
Podczas czytania następna strona (który jest ograniczony), przy użyciu tego kodu:
HttpGet httpget2 = new HttpGet(RESTRICTED_URL);
response = httpclient.execute(httpget2);
entity = response.getEntity();
InputStream data = entity.getContent();
// data will be parsed here
if (entity != null) {
entity.consumeContent();
}
// connection will be closed afterwards
Jeżeli wyjście I odpowiedź GET-życzenie (za pomocą response.getStatusLine()
) pojawia się komunikat "200 OK", ale parsowanie zwróconej strony pokazuje, że logowanie zostało utracone (pobieram tylko formularz logowania).
Każda pomoc jest doceniana.
'httpclient' jest taka sama dla wszystkich żądań i adresy URL są zarówno na samej domeny (zarówno bez SSL). Spróbuję Wireshark, aby dowiedzieć się, co jest wysyłane, dzięki za podpowiedź. – Select0r
Próbowałem już: plik cookie jest dołączony do drugiego żądania (GET) i otrzymuję komunikat "Znaleziono 302", który wyświetli ekran logowania. – Select0r
@ Select0r: brzmi jak coś innego jest wtedy nie tak z drugim żądaniem (np. Serwer oczekuje nagłówka 'Referer:'). – CommonsWare