Cookie
什么是cookie:最簡(jiǎn)單理解就是由http衍生出來(lái)的一種特殊的瀏覽器的緩存,特點(diǎn)是具有時(shí)效性、賬戶相關(guān)性、存儲(chǔ)在客戶端等。
作用:作為客戶端的用戶認(rèn)證的通行證,比如服務(wù)端可以通過(guò)cookie來(lái)區(qū)分到底是哪個(gè)用戶。
Android 中Cookie的管理相關(guān):說(shuō)到cookie的管理,其實(shí)本質(zhì)上就是數(shù)據(jù)的存儲(chǔ)問(wèn)題。在早期的cookie是由CookieSyncManager進(jìn)行管理的,但是在API 21 之后CookieSyncManager被拋棄了,換成了CookieManager來(lái)進(jìn)行管理。
Android中Cookie的存儲(chǔ):項(xiàng)目中使用 WebView 其實(shí)會(huì)自動(dòng)將 Cookie 保存在本地?cái)?shù)據(jù)庫(kù)中。保存是路徑為 data/data/package_name/app_WebView/Cookies 雖然不是 .db 結(jié)尾的,實(shí)際就是一個(gè) .db 文件
CookieSyncManager
使用CookieSyncManager同步cookie數(shù)據(jù):在早期手機(jī)硬件性能比較尷尬的時(shí)候,為了提升瀏覽器的性能,加快cookie的讀寫(xiě),瀏覽器的cookie是存儲(chǔ)在手機(jī)的內(nèi)存上的。但是,當(dāng)當(dāng)存儲(chǔ)在內(nèi)存上是不夠的,還需要保存到存儲(chǔ)器上,這時(shí)CookieSyncManager應(yīng)運(yùn)而生。借助于CookieSyncManager在內(nèi)存和存儲(chǔ)器之間同步瀏覽器的cookie。另外CookieSyncManager同步策略是在一個(gè)獨(dú)立的線程里定時(shí)進(jìn)行同步。
cookie開(kāi)始同步:注意每次同步的時(shí)間間隔是5分鐘
//推薦在Activity.onResume()里調(diào)用
CookieSyncManager.createInstance(context);
CookieSyncManager.getInstance().startSync();
cookie停止同步:
// Activity.onPause()里調(diào)用
CookieSyncManager.getInstance().stopSync()
cookie立即同步:調(diào)用了該方法會(huì)立即進(jìn)行cookie的同步,代碼如下:
// 一般是在webview中的onPageFinished(WebView, String)方法進(jìn)行強(qiáng)制同步
CookieSyncManager.getInstance().sync()
刪除cookie操作:
//通常刪除cookie的是這樣寫(xiě)的
CookieSyncManager.createInstance(this);
CookieManager.getInstance().removeAllCookie();
CookieManager.getInstance().removeSessionCookie();
CookieSyncManager.getInstance().sync();
CookieSyncManager.getInstance().startSync();
CookieManager
使用CookieManager管理cookie:從API 21之后,WebView 已經(jīng)內(nèi)置了cookie的同步操作了。
手動(dòng)設(shè)置cookie:
HttpCookie cookie = new HttpCookie(name, value);
cookie.setDomain(""); // 設(shè)置域名
cookie.setPath("/"); // 設(shè)置path
cookie.setMaxAge(233); // 設(shè)置過(guò)期時(shí)間
// 調(diào)用CookieManager 的方法設(shè)置cookie
// 具有相同的 host 和 path 和 name 的任何現(xiàn)有的 Cookie 將會(huì)被替換為新的 Cookie
CookieManager.getInstance().setCookie(url, cookie.toString());
注:只有cookie的domain和path與請(qǐng)求的URL匹配才會(huì)發(fā)送這個(gè)cookie。
Android 5.0以上的手機(jī)使用原生WebView瀏覽網(wǎng)頁(yè),在進(jìn)行登錄的時(shí)候會(huì)提示驗(yàn)證碼錯(cuò)誤,通過(guò)查找5.0以上系統(tǒng)的api文檔,發(fā)現(xiàn)5.0以上版本的webview做了較大的改動(dòng),如:同步cookie的操作已經(jīng)可以自動(dòng)進(jìn)行,但前提是我們必須開(kāi)啟第三方cookie的支持,
if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
CookieManager.getInstance().setAcceptThirdPartyCookies(webView,true);
}
刪除cookie操作:底層實(shí)現(xiàn)是異步清除數(shù)據(jù)庫(kù)的記錄
//非常簡(jiǎn)潔
CookieManager.getInstance().removeAllCookies(null);
CookieManager.getInstance().flush();
立即同步:注意到這個(gè)flush()方法就是立即同步cookie的操作,與CookieSyncManager中的sync()方法是一樣的