Android WebView Des Problèmes Avec Les Cookies
J'ai un serveur qui envoie mon application android d'un cookie de session utilisé pour
authentifié de la communication. Je suis en train de charger une WebView avec une URL
pointant vers le même serveur et je suis en train de passer dans la session
cookies à des fins d'authentification. J'observe que cela fonctionne
par intermittence, mais je n'ai aucune idée pourquoi. J'utilise le même cookie de session pour faire d'autres appels sur mon serveur et que ces jamais l'échec de l'authentification. J'ai seulement observer ce problème lorsque vous essayez de charger une URL dans une WebView, et il ne se produit pas à chaque fois. Très frustrant.
Ci-dessous le code que j'utilise pour ce faire. Toute aide sera grandement appréciée.
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);
- reportez-vous à cette question stackoverflow.com/questions/2566485/...
Vous devez vous connecter pour publier un commentaire.
Grâce justingrammens! Ce qui a fonctionné pour moi, j'ai réussi à partager le cookie dans mon DefaultHttpClient demandes et WebView activité:
not always the last cookie
de CookieStore est nécessaire pour maintenir la session en WebView (Dans votre logique, vous procédez à l'extraction de la dernière cookie dans la boucle FOR).Solution:Webview CookieSyncManager
cookie
?, Je ne reçois comme:PHPSESSID=ljfakdjfklasdfaj
!, est-ce suffisant ?Grâce Android pour ruiner mon dimanche . . . Heres ce qui fixe mes Applications ( après l'initialisation de votre webview )
Je dois dire que les réponses ci-dessus fonctionnera probablement, mais dans ma situation du moment Android est allé v5+ mon android webview javascript "apps" est mort.
la solution est de donner à l'Android assez de temps pour proccess cookies. Vous pouvez trouver plus d'informations ici: http://code.walletapp.net/post/46414301269/passing-cookie-to-webview
Je voudrais enregistrer un cookie de session en tant que préférence et avec force repeupler le gestionnaire de cookies avec elle. Il semble que le cookie de session à ne pas survivre à l'Activité de redémarrer
J'ai passé plus de la moitié des 3 heures de travail sur un problème similaire. Dans mon cas, j'ai eu un certain nombre d'appels, que j'ai faite à un service web à l'aide d'un
DefaulHttpClient
et puis j'ai eu envie de la session et tous les autres correspondant à des cookies dans monWebView
.Je ne sais pas si cela va résoudre votre problème, car je ne sais pas ce que votre
getCookie()
méthode n', mais dans mon cas, j'ai effectivement eu à appeler.D'abord à supprimer le cookie de session, puis ajouter de nouveau. J'ai découvert que lorsque j'ai essayé de définir le
JSESSIONID
cookie sans le supprimer, la valeur que j'ai voulu configurer pour qu'il n'a pas été enregistrer. Vous ne savez pas si cela va vous aider question en particulier, mais j'ai pensé partager ce que j'avais trouvé.CookieManager.getInstance().removeAllCookie ();
?Mon code de travail
Pour déboguer la requête, "cookieManager.setCookie (....);" Je vous recommande de regarder à travers le contenu de la base de données webviewCookiesChromium.db (stockée dans "/data/data/ma.app.webview/base de données") Là, Vous pouvez voir les paramètres corrects.
La désactivation de "cookieManager.removeSessionCookie();" et/ou "cookieManager.removeAllCookie();"
Comparer la valeur définie avec celles qui sont définies par le navigateur. Ajuster la demande pour l'installation de cookies avant jusqu'à ce que "les drapeaux" navigateur n'est pas installé ira avec ce que Vous décidez. J'ai trouvé qu'une requête peut être "flags":
J'ai une approche très différente de celle d'autres personnes ici, et une approche qui est un travail garanti sans s'occuper de la CookieSyncManager (où vous êtes à la merci de la sémantique comme "Notez que même sync() se produit de manière asynchrone").
Essentiellement, nous parcourir le domaine approprié, puis nous exécuter du javascript dans le contexte de la page pour définir les cookies de ce domaine (de la même façon que la page elle-même serait). Deux inconvénients de la méthode sont susceptibles de présenter un extra round trip time en raison de la requête http que vous avez à faire; et si votre site ne dispose pas de l'équivalent d'une page blanche, il peut flash quel que soit l'URL que vous chargez d'abord avant de vous emmener à la bonne place.
Si vous faites confiance au domaine les cookies sont des à partir, vous pouvez être en mesure de s'en tirer sans apache commons, mais vous devez comprendre que cela peut présenter un XSS risque si vous n'êtes pas prudent.
Ce travail est une partie de code.
Ici la httpclient est le DefaultHttpClient objet utilisé dans le HttpGet/HttpPost demande. Aussi une chose à vous assurer que c'est le nom du cookie et la valeur, il devrait être donné
setCookie va le définir le cookie pour l'URL donnée.
Je magiquement résolu tous mes cookies problèmes avec cette ligne dans le onCreate:
CookieHandler.setDefault(new CookieManager());
edit: il a cessé de travailler aujourd'hui. 🙁 que de la merde, android.
Rencontré ce trop aussi. Voici ce que j'ai fait.
Sur mon LoginActivity, à l'intérieur de mon AsyncTask, j'ai le texte suivant:
//OÙ CookieStoreHelper.sessionCookie est une autre classe contenant la variable sessionCookie défini comme une Liste de cookies et cookieStore définir comme BasicCookieStore cookieStore;
Puis sur mon Fragment, où mon WebView est située j'ai le texte suivant:
à l'intérieur de ma méthode ou juste avant le réglage de la WebViewClient()
Conseil rapide: Avez installé firebug sur firefox ou utiliser la console développeur de google chrome et de tester d'abord votre page web, de la capture du Cookie et de vérifier le domaine de sorte que vous pouvez les stocker quelque part, et assurez-vous que vous définissez correctement le bon domaine.
Edit: édité CookieStoreHelper.des cookies pour CookieStoreHelper.sessionCookie
Couple de commentaires (au moins pour les Api >= 21) que j'ai découvert de mon expérience et m'a donné des maux de tête:
http
ethttps
url sont différentes. Définition d'un cookie pourhttp://www.example.com
est différente de la définition d'un cookie pourhttps://www.example.com
https://www.example.com/
fonctionne maishttps://www.example.com
ne fonctionne pas.CookieManager.getInstance().setCookie
est l'exécution d'une opération asynchrone. Donc, si vous chargez une url tout de suite après l'avoir définie, il n'est pas garanti que les cookies qui ont déjà été écrites. Afin d'éviter toute erreur et l'instabilité des comportements, utiliser le CookieManager#setCookie(String url, String valeur, ValueCallback callback) (lien) et commencer le chargement de l'url après le rappel sera appelé.J'espère que mes deux cents gagner du temps à partir de certaines personnes de sorte que vous n'aurez pas à affronter les mêmes problèmes comme je l'ai fait.
Que j'ai rencontré le même problème et Il va résoudre ce problème dans toutes les versions d'android
N'utilisez pas votre url brut
Au lieu de:
l'utiliser comme ceci: