【问题标题】:How to set cookie in android WebView client如何在 android WebView 客户端中设置 cookie
【发布时间】:2015-10-14 08:39:51
【问题描述】:

我想通过 WebView 调用一个特定的 url。该页面只能在用户已经登录后才能调用。我使用 AsyncHttpClient 库来执行登录调用。成功登录后,通过 WebView 加载 url 似乎无法识别正确的 headers esp cookie。我的怀疑是 HttpClient 和 WebView's HttpClient 之间的 cookie 没有正确同步。知道为什么吗? .这是我如何使用 WebView

    final WebView webView = (WebView) content.findViewById(R.id.web_travel_advisory);
    String url = "http://mydomainurl.com/get_data_after_login";

    webView.setWebViewClient(new WebViewClient());

    CookieSyncManager.createInstance(getActivity());
    CookieSyncManager.getInstance().startSync();
    CookieManager.getInstance().setAcceptCookie(true);

    webView.getSettings().setJavaScriptEnabled(true);

    webView.loadUrl(url);

感谢您的帮助。

【问题讨论】:

标签: android cookies webview asynchttpclient


【解决方案1】:

哦,几个小时后,我终于想通了。首先,CookieSyncManager 在更高版本的 android 中被弃用,因为根据文档的 api 21。所以决定不再使用它。其次,CookieManager 用于存储 WebView 的 cookie。

最终代码

    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setAcceptCookie(true);

    List<Cookie> cookies = WSHelper.cookieStore.getCookies();

    cookieManager.removeAllCookie();

    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if (cookie.getName().contains("session")){
                String cookieString = cookie.getName() + "=" + cookie.getValue() + "; Domain=" + cookie.getDomain();
                cookieManager.setCookie(cookie.getDomain(), cookieString);
                Log.d("CookieUrl",cookieString + " ");
            }
        }
    }
    webView.loadUrl(url);

解决方案的关键变化是:使用 cookie.getDomain() 代替显式域。

cookieManager.setCookie(cookie.getDomain(), cookieString);

【讨论】:

  • 赞成投票,因为您提到提供 cookie 域名而不是 webview 即将加载的服务器域。这解决了我的问题
  • @Tixeon 你能告诉我我需要导入什么库才能让它工作吗?Android Studio 一直在抱怨 List 。此外,我可以特别提到域名吗?怎么样?这样可以节省吗? cookie 并在我们关闭并重新打开应用程序时重用它?
  • 什么是 WSHelper??
  • @AdamKis 您可以从其他地方获取保存的 cookie。
  • 一点用都没有,没有提到为什么我们不能得到 List of cookies
【解决方案2】:

试试这个代码,经过一些改变对我有用:

public class WebViewActivity extends Activity{
    private SharedPreferences mPreferences;

    String token="";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webviewpage);

        mPreferences = getSharedPreferences("CurrentUser", MODE_PRIVATE);

    }

    public void LaunchWebView(View view) {

        WebView myWebView = (WebView) findViewById(R.id.myWebView);
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.getSettings().setSaveFormData(false);

        CookieSyncManager.createInstance(this);
        CookieSyncManager.getInstance().startSync();
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        CookieManager.getInstance().setAcceptThirdPartyCookies(myWebView, true);

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        String token2= mPreferences.getString("auth_token","");

        HashMap<String, String> map = new HashMap<String, String>();
        map.put("x-auth-token", token);

        myWebView.getSettings().setAppCacheEnabled(true);
        myWebView.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view,String url) {
                view.loadUrl(url);
                return true;
            }
        });
        myWebView.loadUrl("YOUR_URL", map);
    }
}

【讨论】:

    【解决方案3】:

    我的问题略有不同,但@Tixeon 的回答给了我解决问题的关键。我正在编写我的 Cookie 并将其添加到 WebView 请求中,但我发现 Android 正在覆盖我的 Cookie 并发送它自己的 Cookie。 所以首先,我必须从数组中删除所有 cookie,然后编写我自己的 Cookie。这是示例代码:

    // Note that my project has minSdkVersion 21, so I can directly use methods only available in Lollipop
    private fun loadUrlInWebView(url: String) {
        webView.settings.apply {
            builtInZoomControls = false
            javaScriptEnabled = true
            useWideViewPort = true
            loadWithOverviewMode = true
            setSupportMultipleWindows(false)
        }
        CookieManager.getInstance().apply {
            setAcceptThirdPartyCookies(webView, true) // My minSdkVersion is 21
            removeAllCookies { value ->
                Log.d("Cookies", "Removed all cookies from CookieManager")
            }
        }
    
        webView.apply {
            isVerticalScrollBarEnabled = true
            isHorizontalScrollBarEnabled = true
            loadUrl(
                url,
                mutableMapOf(
                    "Cookie" to "ThisIsMyCookieWithMyValues",
                    "Accept" to "*/*",
                    "Accept-Encoding" to "gzip, deflate",
                    "Cache-Control" to "no-cache",
                    "Content-type" to "application/x-www-form-urlencoded"
                )
            )
        }
    }
    

    现在请求包含我的 Cookie 而不是 Android 提供的默认 Cookie,并且我在 WebView 中的会话正在工作。希望这对其他人有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 2014-03-31
      • 2011-07-20
      • 1970-01-01
      • 2018-05-31
      • 2020-10-21
      • 1970-01-01
      相关资源
      最近更新 更多