转载自:http://blog.youkuaiyun.com/u013704970/article/details/53735639
最近项目遇到一个新需求,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)
LogUtil.i (TAG, "onPageFinished cookie :" + cookie)
CookieSyncManager.getInstance ().sync ()
//将cookie存到数据库
if(!TextUtils.isEmpty (cookie)){
String[] cookies = cookie.split (";" )
for(int i=0
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)
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
以上的代码是从H5获取cookie并存储到本地数据库。hostStr 和cookieName 这两个是主键。
再次打开webview对cookie进行初始化代码:
/**
* 初始化cookie信息
*/
private void initCookie () {
try {
URL u = new URL(url);
mHost = u.getHost();
} catch (MalformedURLException e) {
e.printStackTrace();
}
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true );
String oldCookie = cookieManager.getCookie(url);
LogUtil.i(TAG, "onPageFinished old cookie :" + oldCookie);
if (TextUtils.isEmpty(oldCookie)) {
ArrayList<WebViewBean> query = DBHelper.getDatabaseDAO().query("hostStr='" + mHost + "'" , WebViewBean.class);
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);
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
我的数据库:
@Table (name="tb_WebViewBean" )
public class WebViewBean {
@PK
@Column (name="hostStr" )
public String hostStr;
@PK
@Column (name="cookieName" )
public String cookieName;
@Column (name="cookieValue" )
public String cookieValue;
}
用的数据库框架:lib_anotation 参考博客:http://zlping.iteye.com/blog/1633213