关于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问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Android AutoCompleteTextView控件基本用法示例
这篇文章主要介绍了Android AutoCompleteTextView控件基本用法,结合实例形式分析了AutoCompleteTextView控件的功能、使用方法及相关操作步骤,需要的朋友可以参考下2016-06-06Android时间对话框TimePickerDialog详解
这篇文章主要为大家详细介绍了Android时间对话框TimePickerDialog的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-02-02
最新评论