web-dev-qa-db-ja.com

AndroidでCookieをwebViewに設定します

ユーザー名またはパスワードが正しいかどうかを確認するときに、サーバーからHttpResponseを取得しています。 urlwebviewをロードするとき、webViewにCookieを持たせたい(postData()で得られる答えはwebViewに格納されます。webViewにCookieを取得し、そのCookieに格納されたurlウェブビュー。

応答を得ています。

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

そして、私はloadUrlで:

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

私は実際にCookieを管理しているわけではなく、その方法がわからないのだと思います。提案や解決策はありますか?

19
Joakim Engstrom

おそらく、このソリューションをご覧になるとよいでしょう: Android WebView Cookie Problem

10
emmby

本当に簡単です。

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

ここで、cookieStringは、従来のSet-Cookie HTTPヘッダー。baseUrlはCookieが属するサイトです。

12
Bryan Field

私の経験からわかった頭痛の種のコメント:

  1. httphttpsのURLは異なります。 _http://www.example.com_のCookieの設定は、_https://www.example.com_のCookieの設定とは異なります
  2. URLの末尾のスラッシュも違いを生む可能性があります。私の場合、_https://www.example.com/_は機能しますが、_https://www.example.com_は機能しません。
  3. CookieManager.getInstance().setCookieは非同期操作を実行しています。そのため、設定した直後にURLを読み込んだ場合、Cookieがすでに書き込まれているとは限りません。予期しない不安定な動作を防ぐには、CookieManager#setCookie(String url、String value、ValueCallback callback)( link )を使用し、コールバックが呼び出された後にURLの読み込みを開始します。

私と同じ問題に直面する必要がないように、私の2セントで一部の人の時間を節約できることを願っています。

4
giorgos.nl

(私の場合のように)Cookieを持つアイテムがほとんどない場合は、ループで使用する必要があります。

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

あなたできません次のように使用します:

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

別の方法でこれを行う方法を投げたいだけです。最高だと言っているわけではありませんが、方法です。 JavaScriptを使用してCookieを設定することもできます。 onPageFinishedWebViewClientをオーバーライドするだけです

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

このアプローチの1つのこと:webViewをリロードする必要があります。誰かがそれを修正する方法を知っているなら、コメントしてください。

0
Sermilion