it-swarm.com.de

Legen Sie einen Cookie für eine WebView in Android fest

Ich erhalte eine HttpResponse von einem Server, wenn ich überprüfe, ob ein Benutzername oder ein Passwort korrekt ist . Wenn ich die url in eine webview lade, möchte ich, dass die webView das Cookie hat (die Antwort, die ich mit postData() in der webView gespeichert habe. Ich möchte, dass der WebView den Cookie aufnimmt und die URL mit diesem im Webview gespeicherten Cookie lädt.

Ich bekomme die Antwort durch.

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;
}

Und ich lade mit:

webView.loadUrl("http://a_page.com/getpage.aspx?p=home");

Ich nehme an, ich verwalte einen Cookie nicht wirklich und habe keine Ahnung, wie er das tun soll ... Irgendwelche Vorschläge oder Lösungen?

17
Joakim Engstrom

Sie werden wahrscheinlich einen Blick auf diese Lösung werfen wollen: Android WebView Cookie Problem

9
emmby

Es ist wirklich ganz einfach.

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

wobei cookieString wie ein herkömmlicher Set-Cookie-HTTP-Header formatiert ist und baseUrl die Site ist, zu der der Cookie gehören sollte.

8
George Bailey

Einige Kommentare, die ich aus meiner Erfahrung herausgefunden habe und mir Kopfschmerzen bereitete:

  1. http- und https-URLs sind unterschiedlich. Das Setzen eines Cookies für http://www.example.com unterscheidet sich vom Setzen eines Cookies für https://www.example.com.
  2. Ein Schrägstrich am Ende der URL kann ebenfalls einen Unterschied machen. In meinem Fall funktioniert https://www.example.com/, aber https://www.example.com funktioniert nicht.
  3. CookieManager.getInstance().setCookie führt eine asynchrone Operation aus. Wenn Sie also eine URL direkt nach dem Festlegen laden, kann nicht garantiert werden, dass die Cookies bereits geschrieben wurden. Um unerwartetes und instabiles Verhalten zu vermeiden, verwenden Sie den CookieManager # setCookie (String url, String value, ValueCallback callback) ( link ) und starten Sie das Laden der URL, nachdem der Callback aufgerufen wird.

Ich hoffe, dass meine zwei Cents von einigen Leuten etwas Zeit sparen, so dass Sie nicht mit den gleichen Problemen konfrontiert werden müssen wie ich.

2
giorgos29cm

Sie sollten es mit einer Schleife verwenden, wenn Sie einige Elemente mit Cookies haben (wie in meinem Fall):

val cookies = "key1=someValue1;key2=someValue2;key3=someValue3"
val cookiesList = cookies.split(";")
cookiesList.forEach { item ->
 CookieManager.getInstance().setCookie("http://someHost.com", item)
}

Du kannst nicht benutze es wie folgt:

CookieManager.getInstance().setCookie("http://someHost.com", "key1=someValue1;key2=someValue2;key3=someValue3")
1
Djek-Grif

Ich möchte nur einen anderen Weg werfen, wie dies möglich ist. Nicht zu sagen, es ist das Beste, aber es ist ein Weg. Sie können JavaScript auch verwenden, um Cookies zu setzen. Überschreiben Sie einfach onPageFinished in 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)
                }
        }
}

Eine Sache mit diesem Ansatz: Sie müssen das WebView neu laden. Wenn jemand weiß, wie man das beheben kann, kommentieren Sie bitte.

0
Sermilion