在Android中http请求的cookie是放在Header中的通过“Set-Cookie”来设置的,而WebView的cookie是在本地私有的数据库中保存着的,换句话说,这两个就是在不同的世界,但是对于cookie来说,又是通用的。问题来了,怎么让二者保持一致呢?
使用场景一:
如果APP处于登录状态,打开H5页面发现竟然还要再登录,这种情况是不是很尴尬!
使用场景二:
当你想统计做个活动会产生多少有效用户数据的时候,你会惊奇的发现,数据链在进入h5后就断掉了。
那么该如何解决这个问题呢?今天就来总结一下。
SETP1:需要有自己的一套管理cookie逻辑
管理cookie的事只有交给自己处理,才有可能让http请求和webView的cookie进行同步,具体实现略;
STEP2:如何从http请求中获取cookie?将cookie注入请求header中?
在此以第三方框架OKHTTP3.0为例
public class HttpCookieManager implements CookieJar {
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
//在此保存cookie
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
//在此注入cookie
return list;
}
}
STEP3:如何从WebView中读取cookie?
public class MyWebViewClient extends WebViewClient {
public void onPageFInish(WebView view, String url){
CookieManager cookieManager = CookieManager.getInstance();
String cookies = cookieManager.getCookie(url);
//判断一下是否真的取到值
String[] cookiesArray = cookies.split(";");
//保存cookie
}
}
STEP4:如何将cookie注入到webView中?
//在webView.loadUrl(url)之前调用此方法,否则无效
public void syncCookie(Context context, String url){
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();
List<Cookie> cookieList = HttpCookieManager.getInstance().loadForRequest(HttpUrl.parse(url));
for(Cookie cookie : cookieList){
//Tips:有多个cookie的时候必须设置多次,否则webView只读第一个cookie
cookieManager.setCookie(url, cookie.toString());
}
cookieManager.setCookie(url, AccountManager.readUserCookie());
CookieSyncManager.getInstance().sync();
}
总结
cookie同步是很有用的功能,也是日常企业很重要的需求,希望这篇文章对你有所帮助。