同步的问题很常见,解决方法基本类似。
/**
* 给WebView同步Cookie
*
* @param context 上下文
* @param url 可以使用[domain][host]
*/
private void syncCookie(Context context, String url) {
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();// 移除旧的[可以省略]
List<HttpCookie> cookies = new PersistentCookieStore(context).getCookies();// 获取Cookie[可以是其他的方式获取]
for (int i = 0; i < cookies.size(); i++) {
HttpCookie cookie = cookies.get(i);
String value = cookie.getName() + "=" + cookie.getValue();
cookieManager.setCookie(url, value);
}
CookieSyncManager.getInstance().sync();// To get instant sync instead of waiting for the timer to trigger, the host can call this.
}
注意:
- 参数中的
URL
在使用过程中基本是域名。例如https://www.baidu.com/
就可以使www.baidu.com
- Cookie 列表的获取根据自己项目的存储方式不同而不同。例如使用
SharedPreferences
和HashMap
- 注意使用
for 循环
进行setCookie(String url, String value)
调用。网上有博客表示使用分号手动拼接的value
值会导致 Cookie 不能完整设置或者无效 - 注意
value
的值是使用key=value
的完整形式。文档提示the cookie as a string, using the format of the 'Set-Cookie' HTTP response header
CookieSyncManager
是个过时的类,Api21 中 WebView 可以自动同步。CookieSyncManager.getInstance().sync();
方法的替代方法是cookieManager.flush();
- Cookie 同步方法要在 WebView 的 setting 设置完之后调用,否则无效。
- 调用
loadUrl(url);
前一句调用此方法进行 Cookie 同步操作。
AgentWeb 设置
String cookie = "token=1234567"; AgentWebConfig.syncCookie(target,cookie);
注意同上