最近项目遇到一个新需求,H5的登录态跟APP的登录态分开,所以需要记住H5的登录状态,但是我的webview app已退出再次打开,cookie就被清空(这个找了很久也没会找到原因)。我的解决方法是:获取H5的cookie,保存在本地数据库,·再次进入webview判断是否有Cookie,如果没有,从本地数据库取出Cookie并设置给webview。
webview管理cookie的机制:将域名和cookie存在数据库中,当webview访问该域下面的网页时就会将该域名相关的cookie带上。所以我们的本地数据库应该将域名和cookie的key做为主键,从H5获取Cookie并解析出键值对存到本地数据库,重新打开webview时如果没有cookie,从本地数据库中取出相应域名的cookie设置给webview。
获取H5cookie并保存的代码如下:
@Override
public void onPageFinished(WebView view, String url) {
LogUtil.i(TAG, "onPageFinished:" + url);
CookieSyncManager.createInstance(mActivity);
CookieManager cookieManager = CookieManager.getInstance();
String cookie = cookieManager.getCookie(url);//从H5获取cookie
LogUtil.i(TAG, "onPageFinished cookie :" + cookie);
CookieSyncManager.getInstance().sync();
//将cookie存到数据库
if(!TextUtils.isEmpty(cookie)){
String[] cookies = cookie.split(";");
for(int i=0;i<cookies.length;i++){
String item = cookies[i];
int index = item.indexOf("=");
WebViewBean bean = new WebViewBean();
bean.hostStr = mHost;
bean.cookieName = item.substring(0, index);
bean.cookieValue = item.substring(index+1);
DBHelper.getDatabaseDAO().insert(bean, WebViewBean.class);
}
}
super.onPageFinished(view, url);
}
以上的代码是从H5获取cookie并存储到本地数据库。hostStr 和cookieName 这两个是主键。
再次打开webview对cookie进行初始化代码:
/**
* 初始化cookie信息
*/
private void initCookie() {
//获取网页的域名
try {
URL u = new URL(url);
mHost = u.getHost();
} catch (MalformedURLException e) {
e.printStackTrace();
}
//获取页面的cookie
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
String oldCookie = cookieManager.getCookie(url);
LogUtil.i(TAG, "onPageFinished old cookie :" + oldCookie);
//如果没有cookie从本地数据库中取出
if(TextUtils.isEmpty(oldCookie)) {
ArrayList<WebViewBean> query = DBHelper.getDatabaseDAO().query("hostStr='" + mHost + "'", WebViewBean.class);
//设置给webview
if(null != query && query.size() > 0){
for (int i=0;i<query.size();i++){
WebViewBean bean = query.get(i);
String key = bean.cookieName;
String value = bean.cookieValue;
String coo = key + "=" + value;
cookieManager.setCookie(mHost, coo);
}
CookieSyncManager.getInstance().sync();
}
String addedCookie = cookieManager.getCookie(url);
LogUtil.i(TAG, "onPageFinished added cookie :" + addedCookie);
}
}
我的数据库:
@Table(name="tb_WebViewBean")
public class WebViewBean {
@PK
@Column(name="hostStr")
public String hostStr;//cookie
@PK
@Column(name="cookieName")
public String cookieName;//cookieName
@Column(name="cookieValue")
public String cookieValue;//cookieValue
}
用的数据库框架:lib_anotation
参考博客:http://zlping.iteye.com/blog/1633213
本文介绍了如何在Android应用中处理WebView的Cookie管理,特别是当WebView在APP退出后重新打开时如何保持H5的登录状态。通过获取H5的Cookie并存储在本地数据库,当再次进入WebView时,若无Cookie则从数据库恢复,确保登录态的延续。代码示例展示了获取和初始化Cookie的过程,使用了lib_annotation数据库框架。

1172

被折叠的 条评论
为什么被折叠?



