大家好,本篇文章是关于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 Webview 设置Cookie问题详解


基础教程推荐
- 解决Android Studio突然不显示logcat日志的问题 2023-02-04
- Android多返回栈技术 2023-04-15
- Android开发使用RecyclerView添加点击事件实例详解 2023-06-15
- android studio按钮监听的5种方法实例详解 2023-01-12
- Flutter绘图组件之CustomPaint使用详解 2023-05-12
- IOS 播放系统提示音使用总结(AudioToolbox) 2023-03-01
- Flutter手势密码的实现示例(附demo) 2023-04-11
- iOS开发教程之XLForm的基本使用方法 2023-05-01
- Android中的webview监听每次URL变化实例 2023-01-23
- IOS应用内跳转系统设置相关界面的方法 2022-11-20