关于Android Webview 设置Cookie问题详解

关于Android Webview 设置Cookie问题详解

最近遇到一个比较坑爹的问题就是webview里添加第三方H5页面,但是数据获取不到,经过一天的折磨发现cookie值每次都会变,再根据谷歌开发者模式定位,cookie每次应该都是固定,每次变化说明本地的cookie有问题,或者为空。

webview有一个CookieManager这个类,他是专门管理cookie的,这个类可以设置一个或多个cookie,而且当你在里面设置好cookie以后接口会自动根据你设置时的url来使用。

一共有两种获取cookie的方法一种是HttpURLConnection获取,一种是直接利用CookieManager获取。

第一种根据url利用HttpURLConnection获取接口中的cookie()

/**
     * 获取接口中的cookie
     * @param loginUrl
     */
    private void syncCookie(final String loginUrl) {
        try {
            StringBuilder builder = new StringBuilder();
            URL url = null;
            byte[] data = builder.toString().getBytes("UTF-8");
            url = new URL(loginUrl);
            HttpURLConnection connection =
                    (HttpURLConnection) url.openConnection();

            connection.setDoOutput(true);
            connection.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            connection.setRequestProperty("Content-Length",
                    Integer.toString(data.length));
            connection.setInstanceFollowRedirects(false);
            connection.setRequestMethod("GET");
            OutputStream os = connection.getOutputStream();
            os.write(data);
            os.close();
            int aRstCode = connection.getResponseCode();
            if (aRstCode == HttpURLConnection.HTTP_OK) {
                cookie = connection.getHeaderField("Set-Cookie");
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

第二种直接利用CookieManager获取

cookieManager.getCookie(url);

这两种返回的cookie是有一些区别的,看你需要哪一种。

设置cookie 允许它跨域

		CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            cookieManager.setAcceptThirdPartyCookies(mWebView, true);//TODO 跨域cookie读取
            Log.d(TAG,"跨域cookie读取");
        }

把cookie设置道webview里

/**
     *@param cookie 上面获取到的存储在本地的cookie字符串
     *@param url 要加载的页面url
     */
    @SuppressLint("NewApi")
    private void setCookie(String cookie, String url) {
        String StringCookie = cookie;
        CookieSyncManager.createInstance(this);
        if (cookieManager == null) {
            cookieManager = CookieManager.getInstance();
        }
        cookieManager.setAcceptFileSchemeCookies(true);
        cookieManager.setAcceptCookie(true);
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {//这个代码是清楚webview里的所有cookie加不加完全看你自己。
            cookieManager.removeSessionCookies(null);
            cookieManager.flush();
        } else {
            cookieManager.removeAllCookie();
            CookieSyncManager.getInstance().sync();
        }
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                cookieManager.setCookie(url, StringCookie, new ValueCallback<Boolean>() {
                    @Override
                    public void onReceiveValue(Boolean aBoolean) {
                        Log.d(TAG,"setCookie() aBoolean:"+aBoolean);
                    }
                });
            }
        });
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            cookieManager.flush();
        } else {
            CookieSyncManager.getInstance().sync();
        }
    }

注意 注意 注意:重要的事情说三遍

有些机型只支持单独设置cookie就比如(瞎写的)
session=jashdkjashdkashdk;path=path
如果你直接把这一整串setCookie进入,是设置不进去的,你需要把他们根据分号切割开,一个一个的给它们设置进去。像这种cookieManager.setCookie(url,“session=jashdkjashdkashdk”)(如果你直接设置进去,并且成功了就当我后面说的是废话)

到此这篇关于关于Android Webview 设置Cookie问题详解的文章就介绍到这了,更多相关Android Webview 置Cookie问题内容请搜索云海天教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持云海天教程!