WebView.loadUrl(URL,headers)在android中不起作用

用户名

我正在标题中设置Cookie并使用此标题调用WebView.loadUrl(),但它(标题中的Cookie)将无法在除4.4之外的任何Android设备上使用。我已经在Android 4.2、4.3、4.4、5.0和5.1版本上对其进行了测试。

webView = (WebView) findViewById(R.id.web_view);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setDisplayZoomControls(false);


HashMap <String, String> extraHeaders = new HashMap<String, String>();
extraHeaders.put("Cookie", "{cookie value}");


webView.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url){
            view.loadUrl(url, extraHeaders);
                return false;
        }
});

webView.loadUrl(url, extraHeaders);
用户名

我通过创建自定义cookie管理器来解决该问题:

public class WebkitCookieManagerProxy extends CookieManager {
    private android.webkit.CookieManager webkitCookieManager;
    public WebkitCookieManagerProxy() {
        this(null, null);
    }
    public WebkitCookieManagerProxy(CookieStore store, CookiePolicy cookiePolicy) {
        super(null, cookiePolicy);
        this.webkitCookieManager = android.webkit.CookieManager.getInstance();
    }
    @Override
    public void put(URI uri, Map<String, List<String>> responseHeaders) throws IOException {
        // make sure our args are valid
        if ((uri == null) || (responseHeaders == null)) return;
        // save our url once
        String url = uri.toString();
        // go over the headers
        for (String headerKey : responseHeaders.keySet()) {
            // ignore headers which aren't cookie related
            if ((headerKey == null) || !(headerKey.equalsIgnoreCase("Set-Cookie2") || headerKey.equalsIgnoreCase("Set-Cookie"))) continue;
            // process each of the headers
            for (String headerValue : responseHeaders.get(headerKey)) {
                this.webkitCookieManager.setCookie(url, headerValue);
            }
        }
    }
    @Override
    public Map<String, List<String>> get(URI uri, Map<String, List<String>> requestHeaders) throws IOException {
        // make sure our args are valid
        if ((uri == null) || (requestHeaders == null)) throw new IllegalArgumentException("Argument is null");
        // save our url once
        String url = uri.toString();
        // prepare our response
        Map<String, List<String>> res = new java.util.HashMap<String, List<String>>();
        // get the cookie
        String cookie = this.webkitCookieManager.getCookie(url);
        if (cookie != null) res.put("Cookie", Arrays.asList(cookie));
        return res;
    }
    @Override
    public CookieStore getCookieStore() {
        // we don't want anyone to work with this cookie store directly
        throw new UnsupportedOperationException();
    }
}

并在Application类中或在应用程序启动时以以下方式初始化自定义cookie管理器:

android.webkit.CookieSyncManager.createInstance(this);
android.webkit.CookieManager.getInstance().setAcceptCookie(true);
WebkitCookieManagerProxy coreCookieManager = new WebkitCookieManagerProxy(null, java.net.CookiePolicy.ACCEPT_ALL);
java.net.CookieHandler.setDefault(coreCookieManager);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章