【W(wǎng)ebView的cookie機制 】輕松搞定WebView cookie同步問題

在進行APP+H5混合開發(fā)的時候,一些功能是用native方法實現(xiàn)的,如登陸,一些功能是用H5實現(xiàn)的。所以往往需要將在native方法登陸的狀態(tài)同步到H5中避免再次登陸。這種情況在Android開發(fā)中比較常見,因為Android不會自動同步cookie到WebView。做iOS開發(fā)則不用擔(dān)心這個問題,因為iOS內(nèi)部已經(jīng)實現(xiàn)了cookie同步。本文將會介紹兩種cookie同步的方式,并重點分析WebView的cookie機制。在開始之前先講一下基于session的登錄驗證。
基于session的登錄驗證:
基于session的登錄驗證,會在程序請求接口的時候判斷服務(wù)器端是否有當(dāng)前會話的session,如果沒有則被認為沒有登錄??蛻舳藳]有session這一概念,但有cookie與其對應(yīng)。每一個session都有一個session id作為唯一標(biāo)識。在登錄成功后服務(wù)器會在請求頭中返回cookie,cookie包含著這次登錄會話的session id,在接下來的請求中只需要將登陸返回的cookie設(shè)置到請求頭中便可以通過驗證。

方式一:客戶端將cookie傳給H5

如何做:

  • 客戶端:將登陸時從服務(wù)器取得的cookie傳給html。
  • html:ajax從參數(shù)中取出客戶端傳來的cookie,ajax發(fā)請求時將客戶端傳來cookie設(shè)置到請求頭中。

ajax修改cookie的方式

$.ajax({
   headers: {'Cookie' : document.cookie },
   url: "sub.domain.com",
   success: function(){}
})

缺點:

  1. 兼容性差,多數(shù)瀏覽器為了安全起見,都做了禁止修改請求中的cookie的限制。比如iOS的WebView會攔截ajax修改的cookie。
  2. 繁瑣,每次請求都需要拼接cookie作為參數(shù),比較繁瑣。

方式二:將cookie同步到WebView(推薦)

原理分析:

WebView的cookie機制

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

查看APP cookie

當(dāng)WebView加載URL的時候,WebView會從本地讀取該URL對應(yīng)的cookie,并攜帶該cookie與服務(wù)器進行通信。
WebView通過android.webkit.CookieManager類來維護cookie。CookieManager是WebView的cookie管理類。

如何做:

下面我們就通過CookieManager將cookie同步到WebView中。
之前同步cookie需要用到CookieSyncManager類,現(xiàn)在這個類已經(jīng)被deprecated。如今WebView已經(jīng)可以在需要的時候自動同步cookie了,所以不再需要創(chuàng)建CookieSyncManager類的對象來進行強制性的同步cookie了?,F(xiàn)在只需要獲得 CookieManager的對象將cookie設(shè)置進去就可以了。

第一步:登錄時從服務(wù)器的返回頭中取出cookie
根據(jù)Http請求的客戶端不同,取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;
}

如圖:

同步cookie

如果設(shè)置成功,通過cookieManager.getCookie(url)方法就可取得剛才設(shè)置的cookie,如果兩次設(shè)置cookie的url相同,則CookieManager會將上一次設(shè)置的cookie覆蓋,已達到更新的效果。
下面我們查看一下Cookie數(shù)據(jù)庫中發(fā)生的變化。
如圖:

查看WebView cookie

提示:

  1. 同步cookie要在WebView加載url之前,否則WebView無法獲得相應(yīng)的cookie,也就無法通過驗證。
  2. 每次登錄成功后都需要調(diào)用"syncCookie"方法將cookie同步到WebView中,同時也達到了更新WebView的cookie。如果登錄后沒有及時將cookie同步到WebView可能導(dǎo)致WebView拿的是舊的session id和服務(wù)器進行通信。

優(yōu)點:

  1. 方便,只需要在登陸后將cookie同步到WebView即可,省去了每次請求都需要設(shè)置一次的繁瑣。
  2. 兼容性好,因為是系統(tǒng)原生支持的,所以兼容性自然比方式一要好,不存在cookie被攔截的問題。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,953評論 2 373

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

  • 背景在HTTP協(xié)議的定義中,采用了一種機制來記錄客戶端和服務(wù)器端交互的信息,這種機制被稱為cookie,cooki...
    時芥藍閱讀 2,378評論 1 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,781評論 18 139
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,319評論 11 349
  • 將cookie同步到WebView(推薦)參考:文/CrazyCodeBoy(簡書作者) android WebV...
    蒸汽飛船閱讀 23,751評論 7 28
  • 作者:晚晴幽草軒www.jeffjade.com/2016/10/31/115-summary-of-cookie...
    饑人谷_Dylan閱讀 1,227評論 0 51