Android端實現Cookie機制
簡介
Sessions是服務端驗證客戶端身份的一種機制。而Cookies是客戶端儲存的一種身份憑證,是由服務端在迴應的訊息頭中通過Set-Cookie欄位“種”在客戶端。以後每次客戶端在向服務端請求時都會在訊息頭中帶上Cookie欄位。服務端就會根據這個Cookie的頭來判斷此次請求是從哪個使用者發過來的,是否是一次有效請求等。
請求www.baidu.com舉例
首次開啟瀏覽器請求http://www.baidu.com,得到的response訊息頭
可以看到裡面包含了幾個“種”Cookie。此時我們再檢視瀏覽器的Cookie,可以看到這些Cookie資訊被“種”下了。
此時再發送一條請求,可以看到請求的訊息頭如下:
客戶端實現
Android自身所帶的HttpUrlConnection方法是預設不開啟Cookie儲存的。不過我們可以用java提供的幾個類來在Android中實現:
可以先在所有請求之前宣告
CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));
開啟此開關後,每次請求的Set-Cookie資訊都會被CookieManager處理。CookieManager又會使用第一個引數傳入的CookieStore來處理Cookie的儲存問題,因為此處傳入了null,系統會預設呼叫一個基於CookieStore實現的CookieStoreImpl類來處理Cookie的儲存,這個類的只有基於記憶體的儲存,當程序被殺死後,下次再進入應用,儲存的Cookie資訊就會丟失。所以我們需要基於CookieStore這個介面實現一個具有記憶體和本地雙儲存機制的Cookie儲存類。
當解決了Cookie的儲存後,我們就需要考慮以後我們的每次請求需要在請求的訊息頭中加入Cookie欄位。以上用CookieStore儲存下來的Cookie資訊都會被儲存成HttpCookie形式的資訊。我們可以上面的百度例子中看到Cookie的組成樣式,所以我們可以提取CookieStore中的資訊並組合。
StringBuilder cookieBuilder = new StringBuilder();
String divider = "";
for (HttpCookie cookie : getCookies()) {
cookieBuilder.append(divider);
divider = ";";
cookieBuilder.append(cookie.getName());
cookieBuilder.append("=");
cookieBuilder.append(cookie.getValue());
}
cookieString = cookieBuilder.toString();
然後把這個cookieString在以後的請求中加入到頭中,如果你用HttpUrlConnection,你就可以
setRequestProperty("Cookie",cookieString);
OK,大功告成。
以下是我在Github上開源的一個基於Volley實現的網路層框架,也包括Cookie機制的Http請求,歡迎大家fork:
https://github.com/CPPAlien/DaVinci