web-dev-qa-db-fra.com

Définir un cookie sur une webView sous Android

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?

17
Joakim Engstrom

Vous voudrez probablement jeter un oeil à cette solution: Problème de cookie Android WebView

9
emmby

C'est assez simple, vraiment.

String cookieString = "cookie_name=cookie_value; path=/";
CookieManager.getInstance().setCookie(baseUrl, cookieString);

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.

8
George Bailey

Quelques commentaires que j'ai appris de mon expérience et qui m'ont donné mal à la tête:

  1. Les adresses 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
  2. Une barre oblique à la fin de l'URL peut également faire la différence. Dans mon cas, https://www.example.com/ fonctionne mais https://www.example.com ne fonctionne pas.
  3. 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.

2
giorgos29cm

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.

0
Sermilion