Android webView的cookie機制

原理分析:

> 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就是有效的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章