Je reçois une HttpResponse
d'un serveur lorsque je vérifie si un nom d'utilisateur ou un mot de passe est correct . Lorsque je charge la url
dans une webview
, je souhaite que la webView
conserve le cookie (la réponse obtenue avec postData()
dans la webView
. Je veux que webView récupère le cookie et charge l’url avec ce cookie stocké dans la vue Web.
Je reçois la réponse.
public HttpResponse postData() {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("https://example.com/login.aspx");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("txtUsername", "user"));
nameValuePairs.add(new BasicNameValuePair("txtPassword", "123"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
String responseAsText = EntityUtils.toString(response.getEntity());
Log.v(TAG , "Response from req: " + responseAsText);
return responseAsText;
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
return null;
}
Et je charge avec:
webView.loadUrl("http://a_page.com/getpage.aspx?p=home");
Je suppose que je ne gère pas vraiment un cookie et que je ne sais pas comment le faire .. Des suggestions ou des solutions?
Vous voudrez probablement jeter un oeil à cette solution: Problème de cookie Android WebView
C'est assez simple, vraiment.
String cookieString = "cookie_name=cookie_value; path=/";
CookieManager.getInstance().setCookie(baseUrl, cookieString);
où cookieString
a le même format qu'un en-tête HTTP Set-Cookie
plus traditionnel, et baseUrl
est le site auquel le cookie doit appartenir.
Quelques commentaires que j'ai appris de mon expérience et qui m'ont donné mal à la tête:
http
et https
sont différentes. Définir un cookie pour http://www.example.com
diffère de celui de cookie pour https://www.example.com
https://www.example.com/
fonctionne mais https://www.example.com
ne fonctionne pas.CookieManager.getInstance().setCookie
effectue une opération asynchrone. Ainsi, si vous chargez immédiatement une URL 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 cookie CookieManager # setCookie (URL de chaîne, valeur de chaîne, rappel ValueCallback) ( link ) et commencez à charger l'URL après l'appel du rappel.J'espère que mes deux sous gagneront du temps à certaines personnes pour que vous n'ayez pas à faire face aux mêmes problèmes que moi.
Je veux juste jeter un autre moyen de faire cela. Ne dis pas que c'est le meilleur, mais c'est un moyen. Vous pouvez également utiliser JavaScript pour définir des cookies. Remplacez simplement onPageFinished
dans WebViewClient
new WebViewClient() {
override fun onPageFinished(view: WebView, url: String) {
val javascript = """document.cookie = "key=$value""""
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
view.evaluateJavascript(javascript) { s -> Timber.d("Inject: %s", s) }
} else {
view.loadUrl("javascript:" + javascript, null)
}
}
}
Une chose avec cette approche: vous devrez recharger la webView. Si quelqu'un sait comment résoudre ce problème, veuillez commenter.