Android webView的cookie机制

来源:互联网 发布:日本娱乐圈黑料 知乎 编辑:程序博客网 时间:2024/05/22 08:04

原理分析:

> WebView是基于webkit内核的UI控件,相当于一个浏览器客户端。它会在本地维护每次会话的cookie( 保存在data/data/package_name/app_WebView/Cookies.db)。
如图:
这里写图片描述
查看APP cookie
当WebView加载URL的时候,WebView会从本地读取该URL对应的cookie,并携带该cookie与服务器进行通信。WebView通过android.webkit.CookieManager类来维护cookie。CookieManager是WebView的cookie管理类。

CookieManager.setCookie()方法:/** * 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 * must not have expired and must not be a session cookie, otherwise it * will be ignored. * * @param url the URL for which the cookie is set * @param value the cookie as a string, using the format of the 'Set-Cookie' *              HTTP response header */  public void setCookie(String url, String value) {  throw new MustOverrideException();  }

注:host、path和name相同的cookie 会被新的给替换掉,注意是host、path和name都相同的。
url参数是你要为哪个cookie设置,而value和服务器返回设置sookie的方法’Set-Cookie‘是一致的。
也就是一个url的多个cookie,要调用多次setCookie,而每一次调用value的值都类似于:
cookie + ";Max-Age=3600" + ";Domain=.163.com" + ";Path = /" // 当然还可以加上版本
一般写法
//value参数不要忘记加domain和path
cookieManager.setCookie(cookie.getDomain(), cookie.getName() + "=" + cookie.getValue() + "; domain=" + cookie.getDomain() + "; path=" + cookie.getPath());

注意这里为什么第一个参数写了个cookie.getDomain(),而不是像api里边说的url这涉及到了cookie的知识,设置cookie时,会先检测cookie的Domain是否和url网址的域名一致,如果不一致设置cookie失败。所以url在里边起到作用,就是检测Domain域名。

注意,只有cookie的domain和path与请求的URL匹配才会发送这个cookie,所以设置cookie的时候value参数不要忘记加domain和path,如上面代码。

如何做:

下面我们就通过CookieManager将cookie同步到WebView中。之前同步cookie需要用到CookieSyncManager类,现在这个类已经被deprecated。如今WebView已经可以在需要的时候自动同步cookie了,所以不再需要创建CookieSyncManager类的对象来进行强制性的同步cookie了。现在只需要获得 CookieManager的对象将cookie设置进去就可以了。

第一步:登录时从服务器的返回头中取出cookie**根据Http请求的客户端不同,取cookie的方式也不同,我就不一一罗列了,需要的网友可以自行Google,以HttpURLcollection为例:
String cookieStr = conn.getHeaderField(“Set-Cookie”);
第二步:将cookie同步到WebView中**

/*** 将cookie同步到WebView* @param url WebView要加载的url* @param cookie 要同步的cookie* @return true 同步cookie成功,false同步cookie失败* @Author JPH*/public static boolean syncCookie(String url,String cookie) {if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {       CookieSyncManager.createInstance(context);}  CookieManager cookieManager = CookieManager.getInstance();  cookieManager.setCookie(url, cookie);//如果没有特殊需求,这里只需要将session id以"key=value"形式作为cookie即可  String newCookie = cookieManager.getCookie(url);  return TextUtils.isEmpty(newCookie)?false:true;}

如图(url可以只到path即可):

同步cookie
如果设置成功,通过cookieManager.getCookie(url)
方法就可取得刚才设置的cookie,下面我们查看一下Cookie数据库中发生的变化。如图:
这里写图片描述
查看WebView cookie
提示:
同步cookie要在WebView加载url之前,否则WebView无法获得相应的cookie,也就无法通过验证。
每次登录成功后都需要调用”syncCookie”方法将cookie同步到WebView中,同时也达到了更新WebView的cookie。如果登录后没有及时将cookie同步到WebView可能导致WebView拿的是旧的session id和服务器进行通信。

优点:
方便,只需要在登陆后将cookie同步到WebView即可,省去了每次请求都需要设置一次的繁琐。
兼容性好,因为是系统原生支持的,所以兼容性自然比方式一要好,不存在cookie被拦截的问题。

>
>
>
>

>
>
>

PS

Cookie相关的Http头

有 两个Http头部和Cookie有关:Set-Cookie和Cookie。

Set-Cookie由服务器发送,它包含在响应请求的头部中。它用于在客户端创建一个Cookie
Cookie头由客户端发送,包含在HTTP请求的头部中。注意,只有cookie的domain和path与请求的URL匹配才会发送这个cookie。
Set-Cookie响应头的格式如下所示:

Set-Cookie: =[; =]…
[; expires=][; domain=]
[; path=][; secure][; httponly]
expires=: 设置cookie的有效期,如果cookie超过date所表示的日期时,cookie将失效。
如果没有设置这个选项,那么cookie将在浏览器关闭时失效。
secure : 表示cookie只能被发送到http服务器。
httponly : 表示cookie不能被客户端脚本获取到。

注:临时cookie(没有expires参数的cookie)不能带有domain选项。
当客户端发送一个http请求时,会将有效的cookie一起发送给服务器。
如果一个cookie的domain和path参数和URL匹配,那么这个cookie就是有效的。

原创粉丝点击