在很多项目中都会涉及到APP的登录状态和h5的登录状态保持一致,核心原理就是在app登陆成功后将登录cookie注入到H5中就可以了,说起来简单,做起来也很简单。
EXAMPLE1:注入cookie
public static void syncCookie(Context context, String url, String cookie){
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.setCookie(url, cookie);
CookieSyncManager.getInstance().sync();
}
有木有觉得很简单,网上类似的代码一箩筐,千篇一律都是如此。本文主要是讲使用细节,细节很重要,很重要,要!
Q1
如果有多个cookie需要注入怎么办?
A1
setCookie(String url, String cookie)方法调用多次即可
Q2
设置的cookie格式有什么要求?
A2
参考设置cookie的源代码:
/**
* Sets a cookie for the given URL. Any existing cookie with the same host,
* path and name will be replaced with the new cookie. The cookie being set
* will be ignored if it is expired.
*
* @param url the URL for which the cookie is to be set
* @param value the cookie as a string, using the format of the 'Set-Cookie'
* HTTP response header
*/
public abstract void setCookie(String url, String value);
可以知道cookie的核心参数:域名、路径、名字及过期时间,缺少任何一个都可能造成cookie无法注入或cookie无法替换本地cookie。
Q3
设置cookie的url有什么要求?
A3
只要包含域名即可,可以这样https://www.baidu.com or .baidu.com
Q4
什么时机注入cookie合适?
A4
通常实在webView.loadUrl();调用之前调用cookie注入。
设置cookie已经清楚,下面再说一下获取cookie,即从h5中获取cookie信息。
EXAMPLE2:获取cookie
CookieManager cookieManager = CookieManager.getInstance();
String cookie = cookieManager.getCookie(String url);
获取cookie的代码很简单,两行即可,同样采用问答的形式,说一下使用过程遇到的坑。
Q1
获取到的cookie是什么格式的?
A1
获取到的cookie格式:name=value;name=value。截取完字符串后需要对name和value进行trim()处理。是没有路径和过期时间的。
Q2
获取cookie合理的时机是什么时候?
A2
通常是在onPageFinish()方法中获取cookie。切记5.0以下,千万不要在shouldInterceptRequest(WebView view, String url)方法里获取cookie,因为getCookie方法会造成卡死。
总结
遇到问题还是多看看源码解释,在注入cookie的时候,我就尝试了很多种方式,都以失败告终,后来参考了源码注释,终于解决了问题。网上很多代码都是人云亦云,这边文章是经验教训总结,希望对你有所帮助!