ユーザー名またはパスワードが正しいかどうかを確認するときに、サーバーからHttpResponse
を取得しています。 url
にwebview
をロードするとき、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を管理しているわけではなく、その方法がわからないのだと思います。提案や解決策はありますか?
おそらく、このソリューションをご覧になるとよいでしょう: Android WebView Cookie Problem
本当に簡単です。
String cookieString = "cookie_name=cookie_value; path=/";
CookieManager.getInstance().setCookie(baseUrl, cookieString);
ここで、cookieString
は、従来のSet-Cookie
HTTPヘッダー。baseUrl
はCookieが属するサイトです。
私の経験からわかった頭痛の種のコメント:
http
とhttps
のURLは異なります。 _http://www.example.com
_のCookieの設定は、_https://www.example.com
_のCookieの設定とは異なりますhttps://www.example.com/
_は機能しますが、_https://www.example.com
_は機能しません。CookieManager.getInstance().setCookie
は非同期操作を実行しています。そのため、設定した直後にURLを読み込んだ場合、Cookieがすでに書き込まれているとは限りません。予期しない不安定な動作を防ぐには、CookieManager#setCookie(String url、String value、ValueCallback callback)( link )を使用し、コールバックが呼び出された後にURLの読み込みを開始します。私と同じ問題に直面する必要がないように、私の2セントで一部の人の時間を節約できることを願っています。
(私の場合のように)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")
別の方法でこれを行う方法を投げたいだけです。最高だと言っているわけではありませんが、方法です。 JavaScriptを使用してCookieを設定することもできます。 onPageFinished
の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)
}
}
}
このアプローチの1つのこと:webViewをリロードする必要があります。誰かがそれを修正する方法を知っているなら、コメントしてください。