webview与h5交互大全webview

android WebView的cookie机制

2016-08-03  本文已影响6291人  蒸汽飞船

将cookie同步到WebView(推荐)
参考:
文/CrazyCodeBoy(简书作者)
android WebView 和 HttpClient cookie同步

原理分析:

当WebView加载URL的时候,WebView会从本地读取该URL对应的cookie,并携带该cookie与服务器进行通信。WebView通过android.webkit.CookieManager类来维护cookie。CookieManager是WebView的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 
 * 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设置进去就可以了。

String cookieStr = conn.getHeaderField("Set-Cookie");
/**
 * 将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响应头的格式如下所示:

Set-Cookie: <name>=<value>[; <name>=<value>]...
   [; expires=<date>][; domain=<domain_name>]
   [; path=<some_path>][; secure][; httponly]

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

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

上一篇下一篇

猜你喜欢

热点阅读