J'ai un serveur qui envoie à mon application Android un cookie de session à utiliser pour une communication authentifiée. J'essaye de charger une WebView avec une URL pointant vers ce même serveur et j'essaye de passer le cookie de session pour l'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 effectuer d'autres appels sur mon serveur et ceux-ci n'échouent jamais à l'authentification. Je n'observe ce problème qu'en essayant de charger une URL dans une WebView, et cela ne se produit pas à chaque fois. Très frustrant.
Voici le code que j'utilise pour ce faire. Toute aide sera fortement 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);
Réponses:
Merci justingrammens ! Cela a fonctionné pour moi, j'ai réussi à partager le cookie dans mes requêtes DefaultHttpClient et l'activité WebView:
la source
Merci Android d'avoir gâché mon dimanche. . . Voici ce qui a corrigé mes applications (après avoir lancé votre webview)
Je devrais dire que les réponses ci-dessus fonctionneront probablement, mais dans ma situation, au moment où Android est passé à la v5 +, mes `` applications '' javascript webview android sont mortes.
la source
Solution: Webview CookieSyncManager
la source
cookie
?, je ne reçois que:PHPSESSID=ljfakdjfklasdfaj
!, est-ce suffisant?la solution est de laisser à Android suffisamment de temps pour traiter les cookies. Vous pouvez trouver plus d'informations ici: http://code.walletapp.net/post/46414301269/passing-cookie-to-webview
la source
Je voudrais enregistrer ce cookie de session comme préférence et le repeupler avec force dans le gestionnaire de cookies. Il semble que le cookie de session ne survit pas au redémarrage de l'activité
la source
J'ai passé la plus grande moitié de 3 heures à travailler sur un problème très similaire. Dans mon cas, j'ai eu un certain nombre d'appels que j'ai passés à un service Web en utilisant un
DefaulHttpClient
, puis j'ai voulu définir la session et tous les autres cookies correspondants dans monWebView
.Je ne sais pas si cela résoudra votre problème, car je ne sais pas ce que fait votre
getCookie()
méthode, mais dans mon cas, j'ai dû appeler.Commencez par supprimer le cookie de session, puis ajoutez-le à nouveau. J'ai découvert que lorsque j'ai essayé de définir le
JSESSIONID
cookie sans le supprimer au préalable, la valeur que je voulais définir n'était pas enregistrée. Je ne sais pas si cela vous aidera à résoudre un problème particulier, mais j'ai pensé que je partagerais ce que j'avais trouvé.la source
CookieManager.getInstance().removeAllCookie ();
?Après quelques recherches, j'ai rassemblé quelques éléments qui m'ont permis d'arriver à cette solution. Une fois que CookieSyncManager est obsolète, cela peut être le meilleur moyen de définir un cookie spécifique pour une vue Web dans Kotlin de nos jours, vous ne devriez plus avoir besoin de rien d'autre.
la source
J'ai une approche différente des autres personnes ici, et c'est une approche qui est garantie de fonctionner sans avoir à traiter avec le CookieSyncManager (où vous êtes à la merci d'une sémantique comme "Notez que même sync () se produit de manière asynchrone").
Essentiellement, nous naviguons vers le bon domaine, puis nous exécutons javascript à partir du contexte de la page pour définir des cookies pour ce domaine (de la même manière que la page elle-même). Deux inconvénients de la méthode sont qu'ils peuvent introduire un temps d'aller-retour supplémentaire en raison de la requête http supplémentaire que vous devez effectuer; et si votre site n'a pas l'équivalent d'une page vierge, il peut flasher quelle que soit l'URL que vous chargez en premier avant de vous emmener au bon endroit.
Si vous faites confiance au domaine d'où proviennent les cookies, vous pourrez peut-être vous en sortir sans apache commons, mais vous devez comprendre que cela peut présenter un risque XSS si vous ne faites pas attention.
la source
C'est un morceau de code fonctionnel.
Ici, le httpclient est l'objet DefaultHttpClient que vous avez utilisé dans la requête HttpGet / HttpPost. Aussi une chose à vérifier est le nom et la valeur du cookie, il doit être donné
setCookie définira le cookie pour l'URL donnée.
la source
J'ai résolu par magie tous mes problèmes de cookies avec cette seule ligne dans onCreate:
CookieHandler.setDefault(new CookieManager());
edit: il a cessé de fonctionner aujourd'hui. :( quelle merde, android.
la source
J'ai rencontré cela aussi. Voici ce que j'ai fait.
Sur mon LoginActivity, dans mon AsyncTask, j'ai ce qui suit:
// WHERE CookieStoreHelper.sessionCookie est une autre classe contenant la variable sessionCookie définie comme List cookies; et cookieStore défini comme BasicCookieStore cookieStore;
Ensuite, sur mon fragment, où se trouve mon WebView, j'ai ce qui suit:
dans ma méthode ou juste avant de définir le WebViewClient ()
Astuce rapide: installez Firebug sur Firefox ou utilisez la console de développement sur Chrome et testez d'abord votre page Web, capturez le cookie et vérifiez le domaine afin de pouvoir le stocker quelque part et être sûr que vous définissez correctement le bon domaine.
Edit: modification de CookieStoreHelper.cookies en CookieStoreHelper.sessionCookie
la source
Mon code de travail
Pour déboguer la requête, "cookieManager.setCookie (....);" Je vous recommande de parcourir le contenu de la base de données webviewCookiesChromium.db (stockée dans "/data/data/my.app.webview/database") Là, vous pouvez voir les paramètres corrects.
Désactivation de "cookieManager.removeSessionCookie ();" et / ou "cookieManager.removeAllCookie ();"
Comparez la valeur définie avec celles définies par le navigateur. Ajustez la demande d'installation des cookies avant jusqu'à ce que le navigateur "flags" ne soit pas installé correspondra à ce que vous décidez. J'ai trouvé qu'une requête peut être des "drapeaux":
la source
Quelques commentaires (au moins pour les API> = 21) que j'ai découverts de mon expérience et qui m'ont donné des maux de tête:
http
et leshttps
URL sont différentes. Définir un cookie pourhttp://www.example.com
est différent de définir un cookie pourhttps://www.example.com
https://www.example.com/
fonctionne maishttps://www.example.com
ne fonctionne pas.CookieManager.getInstance().setCookie
exécute une opération asynchrone. Ainsi, si vous chargez une URL immédiatement après l'avoir définie, il n'est pas garanti que les cookies auront déjà été écrits. Pour éviter les comportements inattendus et instables, utilisez le CookieManager # setCookie (String url, String value, ValueCallback callback) ( lien ) et commencez à charger l'url après l'appel du rappel.J'espère que mes deux centimes feront gagner du temps à certaines personnes pour que vous n'ayez pas à faire face aux mêmes problèmes que moi.
la source
J'ai rencontré le même problème et cela résoudra ce problème dans toutes les versions d'Android
la source
Notez qu'il peut être préférable d'utiliser des sous-domaines au lieu de l'URL habituelle. Alors, définissez
.example.com
au lieu dehttps://example.com/
.Merci à Jody Jacobus Geers et à d'autres, j'ai écrit ainsi:
la source
N'utilisez pas votre URL brute
Au lieu de:
utilisez-le comme ceci:
la source