【问题标题】:Get cookies from webview with path and expiration date从 webview 获取带有路径和到期日期的 cookie
【发布时间】:2016-12-05 18:36:18
【问题描述】:

我目前有一个在 onPageFinished 中获取 cookie 的 webview

mWebview = (WebView) this.findViewById(R.id.myWebView);

    mWebview.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            String cookies = CookieManager.getInstance().getCookie(url);
            Log.d("Cookie", cookies);
        }
    });

    mWebview.loadUrl("http://www.google.com");

CookieManager.getCookie() 只返回 cookie 的名称和值对。

现在我想获取有关该 cookie 的更多信息,例如路径和到期日期等...

知道如何提取 cookie 的所有“原始数据”吗?

【问题讨论】:

    标签: android cookies webview


    【解决方案1】:

    您需要覆盖 WebView 的资源加载才能访问响应标头(Cookie 作为 http 标头发送)。 根据您支持的 Android 版本,您需要覆盖 WebViewClient 的以下两种方法:

    mWebview.setWebViewClient(new WebViewClient() {
    
                @Override
                public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                    if (request != null && request.getUrl() != null && request.getMethod().equalsIgnoreCase("get")) {
                        String scheme = request.getUrl().getScheme().trim();
                        if (scheme.equalsIgnoreCase("http") || scheme.equalsIgnoreCase("https")) {
                            return executeRequest(request.getUrl().toString());
                        }
                    }
                    return null;
                }
    
                @Override
                public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
                    if (url != null) {
                        return executeRequest(url);
                    }
                    return null;
                }
            });
    

    然后您可以自己检索 url 的内容并将其提供给 WebView(通过创建新的 WebResourceResponse)或返回 null 并让 WebView 处理它(考虑到这会再次调用网络!)

    private WebResourceResponse executeRequest(String url) {
            try {
                URLConnection connection = new URL(url).openConnection();
                String cookie  = connection.getHeaderField("Set-Cookie");
                if(cookie != null) {
                    Log.d("Cookie", cookie);
                }
                return null;
                //return new WebResourceResponse(connection.getContentType(), connection.getHeaderField("encoding"), connection.getInputStream());
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    

    【讨论】:

    • 我试过这种方法。但是,我发现 Set-Cookie 中的内容与 cookieManager 中的 cookie 之间存在一些不一致。简单地说,我试图从原始响应中找到一个 cookie 及其信息,因为 cookiemanager 只给你键和值对。但是,我看到 cookie 在某个时间点后出现在 cookiemanager 中,但从未在 Set-Cookie 字段中看到过。请参考我的帖子stackoverflow.com/questions/49835438/…
    • 万一以后有人遇到这个答案,getHeaderField() 方法的文档说明如果有多个标题具有相同的键,则只返回最后一个。使用getHeaderFields() 方法获取带有该键的all 标头。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 2021-08-21
    • 2011-03-17
    • 2017-11-16
    • 2014-01-21
    • 2011-06-23
    • 1970-01-01
    相关资源
    最近更新 更多