【问题标题】:Set a cookie to a webView in Android [duplicate]在Android中将cookie设置为webView [重复]
【发布时间】:2011-04-19 13:13:14
【问题描述】:

在检查用户名或密码是否正确时,我从服务器收到HttpResponse。 当我在webview 中加载url 时,我希望webView 拥有cookie(我通过postData() 得到的答案存储在webView 中。 我希望 webView 获取 cookie 并使用存储在 webview 中的 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;
}

我用以下方式加载Url:

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

我想我并没有真正管理 cookie,而且我不知道该怎么做。 有什么建议或解决方案吗?

【问题讨论】:

标签: android http cookies post


【解决方案1】:

其实很简单。

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

其中cookieString 的格式与更传统的Set-Cookie HTTP 标头相同,baseUrl 是 cookie 应属于的站点。

【讨论】:

  • 最后我找到了解决方案,非常感谢乔治。快速提问。你知道以这种方式 cookie 的持续时间是多少吗?或者设置它的参数是什么?
  • 这是一个会话cookie,所以它可能会在应用程序关闭时过期。要使 cookie 永久化,您将添加 Expire 规则以设置明确的结束日期。在线搜索如何添加 Cookie 过期。如果您在执行此操作时遇到问题,请随时 ask 一个带有代码示例的详细问题。
【解决方案2】:

我从经验中发现的几个让我头疼的cmets:

  1. httphttps 网址不同。为http://www.example.com 设置cookie 与为https://www.example.com 设置cookie 不同
  2. 网址末尾的斜线也可以产生影响。在我的情况下,https://www.example.com/ 有效,但 https://www.example.com 无效。
  3. CookieManager.getInstance().setCookie 正在执行异步操作。因此,如果您在设置 url 后立即加载它,则不能保证 cookie 已经被写入。为防止出现意外和不稳定的行为,请使用 CookieManager#setCookie(String url, String value, ValueCallback callback) (link) 并在调用回调后开始加载 url。

我希望我的两分钱可以节省一些人的时间,这样你就不必像我一样面临同样的问题。

【讨论】:

  • 文档说带回调参数的 setCookie 方法是异步的,但没有说不带回调参数的方法。那是异步的吗?如果是这样,你怎么知道的?
  • 在没有回调的情况下设置 cookie 对我来说是不一致的。 cookie 有时是立即设置的,有时不是。试错,在桌面 Chrome 浏览器中打开 chrome 调试工具,并在我的应用程序中触发 toast,该应用程序显示了我的 webview 当前设置的 cookie。
  • 知道了。谢谢。我最终只是将一个 URL 参数传递给服务器并让服务器处理逻辑和 cookie 设置。
【解决方案3】:

您可能想看看我是如何设置 webview cookie 的:

Android WebView Cookie Problem

在我的回答中你可以看到我是如何处理这个问题的:

val cookieManager = CookieManager.getInstance()
cookieManager.acceptCookie()
cookieManager.setCookie(domain,"$cookieKey=$cookieValue")
cookieManager.setAcceptThirdPartyCookies(view.webViewTest,true)

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • 嘿@AndriiOmelchenko,谢谢你的提示,我在试图回答这里的人这件事上很新……我已经编辑了评论,现在更好了吗?
  • 恕我直言 - 是的,现在更好了。
【解决方案4】:

如果你的 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")

【讨论】:

    【解决方案5】:

    只是想以另一种方式做到这一点。不是说它是最好的,但它是一种方式。您也可以使用 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)
                    }
            }
    }
    

    这种方法的一件事是:您必须重新加载 webView。如果有人知道如何解决这个问题,请发表评论。

    【讨论】:

    • 你可以使用 webview.loadUrl() 来做这个
    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    相关资源
    最近更新 更多