webview把cookies都保存在本地的数据库中,用CookieSyncManager类进行管理。设置cookies的方法是:CookieManager.setCookie(String url, String value)
执行下面代码:
CookieSyncManager.createInstance(context); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setCookie("zlping.com", "userid=\"userid=33333333333\""); cookieManager.setCookie("zlping.com", "ppu=1336455178105"); cookieManager.setCookie(".zlping.com", "userid=\"userid=33333333333\""); cookieManager.setCookie(".zlping.com", "ppu=1336455178105"); CookieSyncManager.getInstance().sync();
在android2.3版本以下,数据保存在webview.db--cookies表中,表结构如下:
setCookie方法中URL参数必须是地址,如“zlping.com”,而不能是“.zlping.com”。否则就会如最后两条domain字段为空。android会自动把“zlping.com”做为域保存在domain中。当webview访问该域下面的网页是就会把前两条cookie带上。
而在3.0以后版本中,数据保存在webviewCookiesChromium.db--cookies表中,表结构如下
可以看出新表中没了domain字段,多出了host_key字段,如果按同样的方法保存cookies,webview访问“zlping.com”域下面的网页时只会把后面两条cookie带上,而不会带前两条cookie。
大家可能看出来了,android3.0以后把url直接保存在了host_key字段中,并当做域来用了。这就和以前的版本有冲突了。经本人实验,可以用以下方法解决:
cookieManager.setCookie("zlping.com", "userid=\"userid=33333333333\"; domain=zlping.com"); cookieManager.setCookie("zlping.com", "ppu=1336455178105; domain=zlping.com");
在value值中加入 domain=zlping.com,来手工设置cookies的域,这样就解决了版本冲突的问。保存在数据库中就是2.3以下版本的前两条,3.0版本的后两条