Android Webview 设置Cookie

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Android Webview 设置Cookie

piaoershi   2022-05-24 我要评论

最近遇到一个比较坑爹的问题就是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”)(如果你直接设置进去,并且成功了就当我后面说的是废话)

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们