2016-08-07 6 views
1

Ich habe eine Android-App erstellt, die sich auf einer Website anmeldet und kratzt. Leider hatte ich Probleme mit JSoup und persistierenden Session-Cookies.Session-Cookie nicht persistent mit JSoup

Jedes Mal, wenn ich versuche, eine POST-Anforderung zu machen, wird die Website darüber beschweren, dass die Sitzung abgelaufen ist. Ich habe die Ursache des Problems auf dem JSESSIONID-Cookie isoliert (seit das Löschen in einem Browser beim Versuch, sich einzuloggen, das gleiche Ergebnis ergibt). Auch wenn ich alle vorherigen Cookies mit der .cookies()-Methode einschließe, wird die Website dennoch darüber klagen, dass die Sitzung abgelaufen ist.

Ich frage mich, ob ich irgendwelche offensichtlichen Fehler mache, dass mein app davon abhalten, eine Sitzung ordnungsgemäß aufrechterhalten wird.

Der relevante Teil meines Codes so weit (Anmerkung: Ich verwende Kotlin für dieses Projekt):

val url = "omitted here" 
val username = "user" 
val password = "hunter2" 

val initial = Jsoup.connect(url) 
      .method(Connection.Method.GET).execute() 

val cookies = initial.cookies() 

val login = Jsoup.connect(url) 
      .userAgent("Mozilla") 
      .data("login_name", username) 
      .data("password", password) 
      .cookies(cookies) 
      .post() 

Jede Hilfe wäre sehr dankbar!

+0

Basierend auf Kommentaren ist es wahrscheinlich kein Kotlin-Problem und stattdessen gibt die Seite keine Cookies vom Server zurück, sondern später per JavaScript. Deaktivieren Sie JavaScript in Ihrem Webbrowser und prüfen Sie, ob Sie im Webbrowser noch ein Cookie erhalten. Ich glaube nicht, dass wir mehr tun könnten, ohne die Seite zu kennen, auf die Sie zugreifen möchten. Aber dann würden wir Ihre Seite für Sie debuggen, anstatt diese Frage zu beantworten. –

Antwort

1

Ihr Code sieht richtig vorausgesetzt, die Cookies später vom Server und nicht über JavaScript festgelegt werden. Wenn kein Code fehlt, sollten die Cookies in die zweite Anfrage gehen. Es kann sein, dass Sie die Funktionsweise der Website und die Verwendung der Cookies falsch interpretieren und möglicherweise bis zur Anmeldung keinen gültigen Cookie zuweisen und sich immer über "Sitzung abgelaufen" bei nicht eingeloggten Cookies beschweren. Vielleicht kein Code-Bug, sondern ein logisches Problem.

Aber Ihre vollständigen Code könnte auch falsch sein, wenn Sie die folgende etwas berücksichtigen nicht:

Sie müssen sich daran erinnern, dass die Jsoup Bibliothek gibt nur Cookies für eine Anfrage, wenn diese spezifische Anforderung empfängt ein Set-Cookie Header vom Server. Es tut nicht die Liste der "alle bekannten Cookies" zurückgeben. Daher müssen Sie eine Karte pflegen, die eine fortlaufende Anhäufung jeder Cookie-Antwort darstellt.

Denken Sie an die response.cookies() Methode als tatsächlich response.newCookiesAddedFromThisRequest() zu sein. Das Codemuster ist:

val cookies = mutableMapOf<String, String>() 

val initialResponse = Jsoup.connect("http://www.whatarecookies.com/cookietest.asp") 
    .method(Connection.Method.GET) 
    .cookies(cookies) 
    .execute() 
cookies.putAll(initialResponse.cookies()) 

val secondResponse = Jsoup.connect("http://www.whatarecookies.com/cookietest.asp") 
    .method(Connection.Method.GET) 
    .cookies(cookies) 
    .execute() 
cookies.putAll(secondResponse.cookies()) 

// `cookies` now contains all cookies added accumulatively 

In diesem Code die zurückgegebenen neuen Cookies werden jedes Mal zu einer verwalteten Karte von Cookies hinzugefügt, und die Gesamtheit aller Cookies werden jede Anfrage gesendet.

Beachten Sie auch: Jsoup verarbeitet keine Cookies in der Header-Reihenfolge, daher wird manchmal der falsche Wert für einen Cookie gesetzt. Es kann auch manchmal Cookie-Werte als Null bei einem Unfall hinterlassen. Sie sollten die known cookie issues für Jsoup überprüfen. Eine Alternative ist die Verwendung von etwas wie OkHttp, um den Abruf des Dokuments durchzuführen und es dann mit Jsoup zu analysieren. Jsoup konzentriert sich nicht so sehr auf das HTTP-Protokoll wie auf die HTML-Analyse und -Manipulation.

+0

Ich habe versucht, sowohl Ihre Code-Lösung und OkHTp für die Anfragen, aber keine Würfel auf beide ...Ich habe auch versucht, eine andere GET-Anfrage zu einer geschützten Ressource nach meinem Formular POST hinzufügen, um zu sehen, ob die richtigen Cookies nach der Tat gesetzt wurden, aber das hat auch nicht funktioniert; Ich kann nur annehmen, dass der Server mit der Behandlung von Cookies etwas Bizarres tut – cmdd

+0

Wenn Cookies vom Server sind, würden Sie sie auf die eine oder andere Weise in JSoup sehen. Es filtert nichts und schiebt sie einfach in die Antwort. Daher könnten sie JavaScript-Cookies hinzugefügt werden. Möglicherweise müssen Sie ein serverseitiges Scraping-System verwenden, das einen vollständigen Browser zum Verarbeiten von Anfragen und zum Zurückgeben der letzten Seite nach Abschluss aller Skripts verwendet. Das ist eine ganz andere Sache .... –

+0

Ich habe versucht, mich mit NoScript in die Seite einzuloggen und es funktionierte perfekt ... Ich bin zu diesem Zeitpunkt völlig am Ende, also probiere ich Selendroid aus (oder benutze nur ein WebView)). Danke für die Hilfe! – cmdd