1. 程式人生 > >Android WebView中Header與Cookie應用場景深入剖析

Android WebView中Header與Cookie應用場景深入剖析

首先回顧一下Cookie與Header這兩個重要的概念,不太清楚的話可以看我之前的部落格或者查詢一下相關的資料:

這裡將兩者在Android平臺上做一個簡單的對比:

Header:

                   

客戶端向伺服器傳送請求,在請求頭中包含請求方法,協議版本,客戶端資訊等內容,這些內容以key,value形式組合,我們稱這些內容為http header

Cookie:

            

1.這裡說的cookie不是傳統意義上的cookie,傳統來講cookie是伺服器儲存在客戶端的資訊,以便下次請求時能夠通過讀取cookie識別客戶端身份等資訊。

2.Cookie傳送也是放在header中傳送的。

3.android.webkit.CookieManagerandroid cookie的管理類,可以講客戶端資訊封裝在cookiemanager中,這樣系統傳送請求時就自動帶上這些cookie資訊。

4.在Android手機中,Cookie的相關資訊儲存在/data/data/package_name/database/webview.db中.


Cookie vs Header


                              Cookie                   headers
生存週期           一段時期有效        每次都需要重新傳遞

讀取                   容易讀取               Ajax請求不能讀取

WebView支援    全支援                   2.2以上才支援

Cookie與Header的對比:

1..Cookie從Android最早的版本已經開始支援. 但Cookie在Android2.2以上才WebView才支援headers(Android2.2才加入了webview.load(url,headers)的API).這方面還好,畢竟現在主流的手機已經普遍安裝了Android4.0及以上的版本,2.2以下的手機市場佔有率並不多了,受到影響不大.

2.但是Ajax請求不能讀取影響就比較嚴重了,畢竟現在的Web頁面大量應用了Ajax跳轉,不可能不處理這種情況. 關於這方面我在之前的

Android WebView常見問題及解決方案彙總 中已經提到,當時是採取特殊標記,過濾Ajax的url,採取將引數拼接到URL末尾的方式.解決.

3.Cookie無論是獲取還是操作都很便捷,無論是Java還是Android平臺都有對應完善的API.

Cookie與Header的應用場景

然後看一下Cookie與Header的應用場景,正好是由兩者的生命週期來決定的:

Headers每次都要重新獲取並進行傳遞,而Cookie,大家想必也知道,本身借用了session的實現,在web端長用與保持比如登入,購物車等狀態的保

概括地來說,如果需要傳遞一些可能會頻繁更新的資訊,我們可以使用Headers或者拼接引數的方法(處理ajax等非超連結請求).但如果只是需要保持一定的狀態呢,就需要使用Cookie.

從另外一個角度來說, 使用Header傳遞資料往往導致使用者使用客戶端時,一定操作後會導致顯示不同的頁面或者頁面更新. 而Cookie的使用,使得整個頁面或者頁面固定的部分顯示固定的資訊.

Cookie在Android平臺上的應用:

Cookie的獲取:

  CookieManager cm = CookieManager.getInstance();
  String Cookiestr = cm.getCookie(url);

Cookie的同步:
CookieSyncManager.createInstance(this);

CookieSyncManager.getInstance().sync();

注意,此處程式碼需在在webview載入URL前設定,並且在呼叫後,不再設定webview的websetttings屬性,否則會導致失效.

一般通過HttpClient,獲取伺服器的Cookie後再進行設定(比如一些登入的使用者資訊或者狀態資訊):

List<Cookie> cookies = httpclient.getCookieStore().getCookies();  

清除Cookie:

CookieManager.getInstance().removeSessionCookie(); 
CookieManager.getInstance().removeAllCookies();

如果只是需要刪除和特定url關聯的cookie,需要先進行移除後同步:

	/**
	 * 同步一下cookie
	 */
	public static void synCookies(Context context, String url) {
		CookieSyncManager.createInstance(context);
		CookieManager cookieManager = CookieManager.getInstance();
		cookieManager.setAcceptCookie(true);
		cookieManager.removeSessionCookie();//移除
		cookieManager.setCookie(url, cookies);//指定要修改的cookies
		CookieSyncManager.getInstance().sync();
	}