Android WebView中Header與Cookie應用場景深入剖析
首先回顧一下Cookie與Header這兩個重要的概念,不太清楚的話可以看我之前的部落格或者查詢一下相關的資料:
這裡將兩者在Android平臺上做一個簡單的對比:
Header:
客戶端向伺服器傳送請求,在請求頭中包含請求方法,協議版本,客戶端資訊等內容,這些內容以key,value形式組合,我們稱這些內容為http header。
Cookie:
1.這裡說的cookie不是傳統意義上的cookie,傳統來講cookie是伺服器儲存在客戶端的資訊,以便下次請求時能夠通過讀取cookie識別客戶端身份等資訊。
2.Cookie傳送也是放在header中傳送的。
3.android.webkit.CookieManager是android 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跳轉,不可能不處理這種情況. 關於這方面我在之前的
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();
}