Cookie 和 CookieManager

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()方法是一樣的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容