android WebView的cookie機(jī)制

將cookie同步到WebView(推薦)
參考:
文/CrazyCodeBoy(簡(jiǎn)書作者)
android WebView 和 HttpClient cookie同步

原理分析:

  • WebView是基于webkit內(nèi)核的UI控件虱黄,相當(dāng)于一個(gè)瀏覽器客戶端悦即。它會(huì)在本地維護(hù)每次會(huì)話的cookie(保存在data/data/package_name/app_WebView/Cookies.db)。如圖:


    查看APP cookie

當(dāng)WebView加載URL的時(shí)候,WebView會(huì)從本地讀取該URL對(duì)應(yīng)的cookie橱乱,并攜帶該cookie與服務(wù)器進(jìn)行通信辜梳。WebView通過android.webkit.CookieManager類來維護(hù)cookie。CookieManager是WebView的cookie管理類泳叠。

  • CookieManager.setCookie()方法:
/** 
 * Sets a cookie for the given URL. Any existing cookie with the same host, 
 * path and name will be replaced with the new cookie. The cookie being set 
 * must not have expired and must not be a session cookie, otherwise it 
 * will be ignored. 
 * 
 * @param url the URL for which the cookie is set 
 * @param value the cookie as a string, using the format of the 'Set-Cookie' 
 *              HTTP response header 
 */  
public void setCookie(String url, String value) {  
    throw new MustOverrideException();  
}  

注:host作瞄、path和name相同的cookie 會(huì)被新的給替換掉,注意是host危纫、path和name都相同的宗挥。
url參數(shù)是你要為哪個(gè)cookie設(shè)置节预,而value和服務(wù)器返回設(shè)置sookie的方法'Set-Cookie‘是一致的。
也就是一個(gè)url的多個(gè)cookie属韧,要調(diào)用多次setCookie安拟,而每一次調(diào)用value的值都類似于:

cookie + ";Max-Age=3600" + ";Domain=.163.com" + ";Path = /"  // 當(dāng)然還可以加上版本等信息  

一般寫法:

//value參數(shù)不要忘記加domain和path
cookieManager.setCookie(cookie.getDomain(), cookie.getName() + "=" + cookie.getValue() 
+ "; domain=" + cookie.getDomain() + "; path=" + cookie.getPath());

注意這里為什么第一個(gè)參數(shù)寫了個(gè)cookie.getDomain(),而不是像api里邊說的url這涉及到了cookie的知識(shí)宵喂,設(shè)置cookie時(shí)糠赦,會(huì)先檢測(cè)cookie的Domain是否和url網(wǎng)址的域名一致,如果不一致設(shè)置cookie失敗锅棕。所以u(píng)rl在里邊起到作用拙泽,就是檢測(cè)Domain域名。

注意裸燎,只有cookie的domain和path與請(qǐng)求的URL匹配才會(huì)發(fā)送這個(gè)cookie顾瞻,所以設(shè)置cookie的時(shí)候value參數(shù)不要忘記加domain和path,如上面代碼德绿。

如何做:

下面我們就通過CookieManager將cookie同步到WebView中荷荤。之前同步cookie需要用到CookieSyncManager類,現(xiàn)在這個(gè)類已經(jīng)被deprecated移稳。如今WebView已經(jīng)可以在需要的時(shí)候自動(dòng)同步cookie了蕴纳,所以不再需要?jiǎng)?chuàng)建CookieSyncManager類的對(duì)象來進(jìn)行強(qiáng)制性的同步cookie了。現(xiàn)在只需要獲得 CookieManager的對(duì)象將cookie設(shè)置進(jìn)去就可以了个粱。

  • 第一步:登錄時(shí)從服務(wù)器的返回頭中取出cookie**根據(jù)Http請(qǐng)求的客戶端不同古毛,取cookie的方式也不同,我就不一一羅列了都许,需要的網(wǎng)友可以自行Google稻薇,以HttpURLcollection為例:
String cookieStr = conn.getHeaderField("Set-Cookie");
  • 第二步:將cookie同步到WebView中**
/**
 * 將cookie同步到WebView
 * @param url WebView要加載的url
 * @param cookie 要同步的cookie
 * @return true 同步cookie成功,false同步cookie失敗
 * @Author JPH
 */
public static boolean syncCookie(String url,String cookie) {
 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {   
      CookieSyncManager.createInstance(context);
 }  
  CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setCookie(url, cookie);//如果沒有特殊需求胶征,這里只需要將session id以"key=value"形式作為cookie即可
    String newCookie = cookieManager.getCookie(url);
    return TextUtils.isEmpty(newCookie)?false:true;
}

如圖(url可以只到path即可):

同步cookie

如果設(shè)置成功塞椎,通過cookieManager.getCookie(url)
方法就可取得剛才設(shè)置的cookie,下面我們查看一下Cookie數(shù)據(jù)庫(kù)中發(fā)生的變化弧烤。如圖:


查看WebView cookie

提示:
同步cookie要在WebView加載url之前忱屑,否則WebView無(wú)法獲得相應(yīng)的cookie蹬敲,也就無(wú)法通過驗(yàn)證暇昂。
每次登錄成功后都需要調(diào)用"syncCookie"方法將cookie同步到WebView中,同時(shí)也達(dá)到了更新WebView的cookie伴嗡。如果登錄后沒有及時(shí)將cookie同步到WebView可能導(dǎo)致WebView拿的是舊的session id和服務(wù)器進(jìn)行通信急波。

優(yōu)點(diǎn):
方便,只需要在登陸后將cookie同步到WebView即可瘪校,省去了每次請(qǐng)求都需要設(shè)置一次的繁瑣澄暮。
兼容性好名段,因?yàn)槭窍到y(tǒng)原生支持的,所以兼容性自然比方式一要好泣懊,不存在cookie被攔截的問題伸辟。

PS

Cookie相關(guān)的Http頭

有 兩個(gè)Http頭部和Cookie有關(guān):Set-Cookie和Cookie

  • Set-Cookie由服務(wù)器發(fā)送馍刮,它包含在響應(yīng)請(qǐng)求的頭部中信夫。它用于在客戶端創(chuàng)建一個(gè)Cookie
  • Cookie頭由客戶端發(fā)送,包含在HTTP請(qǐng)求的頭部中卡啰。注意静稻,只有cookie的domain和path與請(qǐng)求的URL匹配才會(huì)發(fā)送這個(gè)cookie。

Set-Cookie響應(yīng)頭的格式如下所示:

Set-Cookie: <name>=<value>[; <name>=<value>]...
   [; expires=<date>][; domain=<domain_name>]
   [; path=<some_path>][; secure][; httponly]

expires=<date>: 設(shè)置cookie的有效期匈辱,如果cookie超過date所表示的日期時(shí)振湾,cookie將失效。
如果沒有設(shè)置這個(gè)選項(xiàng)亡脸,那么cookie將在瀏覽器關(guān)閉時(shí)失效押搪。
secure : 表示cookie只能被發(fā)送到http服務(wù)器。
httponly : 表示cookie不能被客戶端腳本獲取到浅碾。

注:臨時(shí)cookie(沒有expires參數(shù)的cookie)不能帶有domain選項(xiàng)嵌言。
當(dāng)客戶端發(fā)送一個(gè)http請(qǐng)求時(shí),會(huì)將有效的cookie一起發(fā)送給服務(wù)器及穗。
如果一個(gè)cookie的domain和path參數(shù)和URL匹配摧茴,那么這個(gè)cookie就是有效的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末埂陆,一起剝皮案震驚了整個(gè)濱河市苛白,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌焚虱,老刑警劉巖购裙,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鹃栽,居然都是意外死亡躏率,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門民鼓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來薇芝,“玉大人,你說我怎么就攤上這事丰嘉『坏剑” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵饮亏,是天一觀的道長(zhǎng)耍贾。 經(jīng)常有香客問我阅爽,道長(zhǎng),這世上最難降的妖魔是什么荐开? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任付翁,我火速辦了婚禮,結(jié)果婚禮上晃听,老公的妹妹穿的比我還像新娘胆敞。我一直安慰自己,他們只是感情好杂伟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布移层。 她就那樣靜靜地躺著,像睡著了一般赫粥。 火紅的嫁衣襯著肌膚如雪观话。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天越平,我揣著相機(jī)與錄音频蛔,去河邊找鬼。 笑死秦叛,一個(gè)胖子當(dāng)著我的面吹牛晦溪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挣跋,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼三圆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了避咆?” 一聲冷哼從身側(cè)響起舟肉,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎查库,沒想到半個(gè)月后路媚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡樊销,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年整慎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片围苫。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡裤园,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出够吩,到底是詐尸還是另有隱情比然,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布周循,位于F島的核電站强法,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏湾笛。R本人自食惡果不足惜饮怯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嚎研。 院中可真熱鬧蓖墅,春花似錦、人聲如沸临扮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)杆勇。三九已至贪壳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚜退,已是汗流浹背闰靴。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钻注,地道東北人蚂且。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像幅恋,于是被迫代替她去往敵國(guó)和親杏死。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容