Android WebView注入cookie的正确使用方式

在很多项目中都会涉及到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的时候,我就尝试了很多种方式,都以失败告终,后来参考了源码注释,终于解决了问题。网上很多代码都是人云亦云,这边文章是经验教训总结,希望对你有所帮助!

你可能感兴趣的:(Android WebView注入cookie的正确使用方式)