【问题标题】:Inject Cookies into a WebView将 Cookie 注入 WebView
【发布时间】:2019-09-11 15:03:06
【问题描述】:

我正在调用一个服务来获取像这样的 JSONArray 的 Cookies

{"domain":"blabla.com","expirationDate":1896127200,"hostOnly":false,"httpOnly":false,"name":"__ssid","path":"\/","sameSite":"no_restriction","secure":false,"session":false,"storeId":"0","value":"392997aa-ce67-4d96-a73d-de0ad794f7bf","id":1}

然后像这样解析这些cookie

Cookie cookie = new Cookie.Builder()
                        .domain(checkDomain(jsonObject.optString("domain")))
                        .expiresAt(jsonObject.optLong("expirationDate"))
                        .name(jsonObject.optString("name"))
                        .path(jsonObject.optString("path"))
                        .value(jsonObject.optString("value"))
                        .build();

然后像这样注入cookie

CookieSyncManager.createInstance(this);
    CookieManager cookieManager = CookieManager.getInstance();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        cookieManager.setAcceptThirdPartyCookies(webView, true);
    } else {
        cookieManager.setAcceptCookie(true);
    }
    cookieManager.removeAllCookie();


    if (cookies != null) {
        for (Cookie cookie : cookies) {
            String cookieString = cookie.name() + "=" + cookie.value() + "; domain=" + cookie.domain();
            cookieManager.setCookie(cookie.domain(), cookieString);
            CookieSyncManager.getInstance().sync();
        }
    }

但是当我将https://blabla.com 加载到 WebView cookie 中时,cookie 不起作用,我是否遗漏了什么?

请帮忙

【问题讨论】:

  • 对我的回答有任何批评吗?
  • cookie.domain() 对于数组中的多个值是否相同?如果是这样,它将像 Hashmap 一样被替换。请参阅docs 了解更多信息。

标签: android cookies webview


【解决方案1】:

这是我使用的,效果很好:

    CookieManager.getInstance().setCookie(treeUrl, cookieString);            
    CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);
    webView.loadUrl("www.example.com");

如果您必须将 JSON 注入 cookie,只需使用 yourJson.toString()

【讨论】:

    【解决方案2】:

    您可以使用下面的代码来设置cookies。

    web_view = findViewById(R.id.web_view);
        CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(web_view.getContext());
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        cookieManager.removeSessionCookie();
        cookieManager.setCookie(URL,"uniqueId=10028; Domain=.codean.app");
        cookieSyncManager.sync();
    
        String cookie = cookieManager.getCookie(URL);
    
        Log.e(TAG, ""+cookie);
        web_view.getSettings().setJavaScriptEnabled(true);
        web_view.setWebViewClient(new WebViewClient());
        web_view.loadUrl(URL);
    

    输出:

    2019-09-16 15:20:21.412 31408-31408/com.sam.webviewtest E/MainActivity: uniqueId=10028
    2019-09-16 15:20:22.204 31408-31408/com.sam.webviewtest E/SpannableStringBuilder: SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
    2019-09-16 15:20:22.205 31408-31408/com.sam.webviewtest E/SpannableStringBuilder: SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
    

    出于测试目的,您可以使用以下网址

    https://codean.app/so/cookies.php
    

    在这个php文件中,它只输出所有的cookies

    <pre><?php print_r( $_COOKIE ); ?></pre>
    

    我在上面的示例中使用了相同的 url,

    【讨论】:

      【解决方案3】:

      请试试这个:

      private fun setCookie(){
      val cookieManager = CookieManager.getInstance()
      cookieManager.acceptCookie()
      
      val domain = "https://www.yourdomain.com"
      
      webView.webViewClient = WebViewClient()
      webViewTest.settings.javaScriptEnabled = true
      webViewTest.loadUrl(domain)
      
      cookieManager.setCookie(domain,"$cookieKey=$cookieValue")
      cookieManager.setAcceptThirdPartyCookies(view.webViewTest,true)
      

      }

      【讨论】:

      • cookieManager.acceptCookie() 是 getter,而不是 setter
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多