从webview获取包含路径和到期日期的cookie

Luc*_*s78 8 cookies android webview

我目前有一个webview,它在onPageFinished中获得了cookie

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");
Run Code Online (Sandbox Code Playgroud)

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

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

我怎么知道如何提取cookie的所有"原始数据"?

小智 5

您需要覆盖 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;
            }
        });
Run Code Online (Sandbox Code Playgroud)

然后,您可以自己检索 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;
    }
Run Code Online (Sandbox Code Playgroud)

  • 如果以后有人遇到这个答案,“getHeaderField()”方法的文档说明,如果有多个标头具有相同的键,则仅返回最后一个标头。使用 getHeaderFields() 方法获取具有该键的所有标头。 (2认同)