Ich habe einen Server, der meiner Android-App ein Sitzungscookie sendet, das für die authentifizierte Kommunikation verwendet wird. Ich versuche, eine WebView mit einer URL zu laden, die auf denselben Server verweist, und ich versuche, das Sitzungscookie zur Authentifizierung zu übergeben. Ich beobachte, dass es zeitweise funktioniert, aber ich habe keine Ahnung warum. Ich verwende dasselbe Sitzungscookie, um andere Anrufe auf meinem Server zu tätigen, und diese scheitern nie an der Authentifizierung. Ich beobachte dieses Problem nur, wenn ich versuche, eine URL in eine WebView zu laden, und es tritt nicht jedes Mal auf. Sehr frustrierend.
Unten ist der Code, den ich dazu benutze. Jede Hilfe wird sehr geschätzt.
String myUrl = ""http://mydomain.com/";
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
Cookie sessionCookie = getCookie();
if(sessionCookie != null){
String cookieString = sessionCookie.getName() +"="+sessionCookie.getValue()+"; domain="+sessionCookie.getDomain();
cookieManager.setCookie(myUrl, cookieString);
CookieSyncManager.getInstance().sync();
}
WebView webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new MyWebViewClient());
webView.loadUrl(myUrl);
Antworten:
Danke justingrammens ! Das hat bei mir funktioniert. Ich habe es geschafft, das Cookie in meinen DefaultHttpClient-Anforderungen und in meiner WebView-Aktivität freizugeben:
quelle
Danke Android, dass du meinen Sonntag ruiniert hast. . . Hier ist, was meine Apps repariert hat (nachdem Sie Ihre Webansicht initiiert haben)
Ich sollte sagen, dass die obigen Antworten wahrscheinlich funktionieren werden, aber in meiner Situation starb in dem Moment, in dem Android v5 + ging, meine Android-Webview-Javascript-Apps.
quelle
Lösung: Webview CookieSyncManager
quelle
cookie
?, ich bekomme nur wie:PHPSESSID=ljfakdjfklasdfaj
!, ist das genug?Die Lösung besteht darin, dem Android genügend Zeit zu geben, um Cookies zu verarbeiten. Weitere Informationen finden Sie hier: http://code.walletapp.net/post/46414301269/passing-cookie-to-webview
quelle
Ich würde dieses Sitzungscookie als Präferenz speichern und den Cookie-Manager mit Nachdruck damit neu füllen. Es hört sich so an, als würde das Sitzungscookie den Neustart der Aktivität nicht überleben
quelle
Ich habe die größere Hälfte von 3 Stunden damit verbracht, an einem sehr ähnlichen Thema zu arbeiten. In meinem Fall hatte ich eine Reihe von Anrufen, die ich mit einem Webdienst getätigt habe,
DefaulHttpClient
und dann wollte ich die Sitzung und alle anderen entsprechenden Cookies in meinem setzenWebView
.Ich weiß nicht, ob dies Ihr Problem lösen wird, da ich nicht weiß, was Ihre
getCookie()
Methode tut, aber in meinem Fall musste ich tatsächlich anrufen.Entfernen Sie zuerst das Sitzungscookie und fügen Sie es dann erneut hinzu. Ich habe festgestellt, dass
JSESSIONID
der Wert, auf den ich ihn setzen wollte, nicht gespeichert wurde, als ich versuchte, das Cookie zu setzen, ohne es zuerst zu entfernen. Ich bin mir nicht sicher, ob dies Ihnen bei einem bestimmten Problem helfen wird, dachte aber, ich würde teilen, was ich gefunden habe.quelle
CookieManager.getInstance().removeAllCookie ();
?Nach einiger Zeit der Recherche habe ich einige Teile gesammelt, die mich zu dieser Lösung gebracht haben. Sobald dieser CookieSyncManager veraltet ist, kann dies heutzutage der beste Weg sein, ein bestimmtes Cookie für eine Webansicht in Kotlin zu setzen. Sie sollten nichts anderes mehr benötigen.
quelle
Ich habe einen anderen Ansatz als andere Leute hier, und es ist ein Ansatz, der garantiert funktioniert, ohne sich mit dem CookieSyncManager zu befassen (wo Sie der Semantik wie "Beachten Sie, dass sogar sync () asynchron geschieht" ausgeliefert sind).
Im Wesentlichen navigieren wir zur richtigen Domain und führen dann Javascript aus dem Seitenkontext aus, um Cookies für diese Domain zu setzen (genau wie die Seite selbst). Zwei Nachteile der Methode sind, dass aufgrund der zusätzlichen http-Anforderung, die Sie stellen müssen, eine zusätzliche Umlaufzeit eingeführt werden kann. Wenn Ihre Website nicht das Äquivalent einer leeren Seite hat, wird möglicherweise die URL geladen, die Sie zuerst geladen haben, bevor Sie an den richtigen Ort gebracht werden.
Wenn Sie der Domain vertrauen, von der die Cookies stammen, können Sie möglicherweise ohne Apache Commons davonkommen. Sie müssen jedoch verstehen, dass dies ein XSS-Risiko darstellen kann, wenn Sie nicht vorsichtig sind.
quelle
Dies ist ein funktionierender Code.
Hier ist der httpclient das DefaultHttpClient-Objekt, das Sie in der HttpGet / HttpPost-Anforderung verwendet haben. Außerdem sollten Sie sicherstellen, dass der Name und der Wert des Cookies angegeben werden
setCookie setzt das Cookie für die angegebene URL.
quelle
Ich habe alle meine Cookie-Probleme mit dieser einen Zeile in onCreate auf magische Weise gelöst:
CookieHandler.setDefault(new CookieManager());
edit: es hat heute aufgehört zu funktionieren. :( Was zum Teufel, Android.
quelle
Auch dem begegnet. Folgendes habe ich getan.
In meiner LoginActivity in meiner AsyncTask habe ich Folgendes:
// WHERE CookieStoreHelper.sessionCookie ist eine weitere Klasse, die die Variable ListCookie enthält, die als List Cookies definiert ist. und cookieStore definieren als BasicCookieStore cookieStore;
Dann habe ich auf meinem Fragment, wo sich mein WebView befindet, Folgendes:
in meiner Methode oder kurz bevor Sie den WebViewClient () einstellen
Kurztipp: Lassen Sie firebug auf Firefox installieren oder verwenden Sie die Entwicklerkonsole auf Chrome und testen Sie zuerst Ihre Webseite, erfassen Sie das Cookie und überprüfen Sie die Domain, damit Sie es irgendwo speichern und sicherstellen können, dass Sie die richtige Domain richtig einstellen.
Bearbeiten: CookieStoreHelper.cookies zu CookieStoreHelper.sessionCookie bearbeitet
quelle
Mein Arbeitscode
Um die Abfrage zu debuggen, "cookieManager.setCookie (....);" Ich empfehle Ihnen, den Inhalt der Datenbank webviewCookiesChromium.db (gespeichert in "/data/data/my.app.webview/database") durchzusehen. Dort sehen Sie die richtigen Einstellungen.
Deaktivieren von "cookieManager.removeSessionCookie ();" und / oder "cookieManager.removeAllCookie ();"
Vergleichen Sie den eingestellten Wert mit denen, die vom Browser eingestellt wurden. Passen Sie die Anforderung für die Installation der Cookies an, bis der Browser "Flags" nicht installiert ist. Ich habe festgestellt, dass eine Abfrage "Flags" sein kann:
quelle
Einige Kommentare (zumindest für APIs> = 21), die ich aus meiner Erfahrung herausgefunden und mir Kopfschmerzen bereitet habe:
http
undhttps
URLs sind unterschiedlich. Das Festlegen eines Cookies fürhttp://www.example.com
unterscheidet sich vom Festlegen eines Cookies fürhttps://www.example.com
https://www.example.com/
funktioniert aberhttps://www.example.com
nicht.CookieManager.getInstance().setCookie
führt eine asynchrone Operation durch. Wenn Sie also eine URL sofort nach dem Festlegen laden, kann nicht garantiert werden, dass die Cookies bereits geschrieben wurden. Um unerwartete und instabile Verhaltensweisen zu vermeiden, verwenden Sie den CookieManager # setCookie (String-URL, String-Wert, ValueCallback-Rückruf) ( Link ) und laden Sie die URL, nachdem der Rückruf aufgerufen wurde.Ich hoffe, meine zwei Cent sparen einigen Leuten Zeit, damit Sie nicht mit den gleichen Problemen konfrontiert werden wie ich.
quelle
Ich habe das gleiche Problem und es wird dieses Problem in allen Android-Versionen beheben
quelle
Beachten Sie, dass es möglicherweise besser ist, Subdomains anstelle der üblichen URL zu verwenden. Also setzen
.example.com
statthttps://example.com/
.Dank Jody Jacobus Geers und anderen habe ich so geschrieben:
quelle
Verwenden Sie nicht Ihre rohe URL
Anstatt:
benutze es so:
quelle