【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ā)則不用擔心這個問題闸度,因為iOS內(nèi)部已經(jīng)實現(xiàn)了cookie同步。本文將會介紹兩種cookie同步的方式蚜印,并重點分析WebView的cookie機制莺禁。在開始之前先講一下基于session的登錄驗證。
基于session的登錄驗證:
基于session的登錄驗證窄赋,會在程序請求接口的時候判斷服務器端是否有當前會話的session哟冬,如果沒有則被認為沒有登錄∫浯拢客戶端沒有session這一概念柒傻,但有cookie與其對應。每一個session都有一個session id作為唯一標識较木。在登錄成功后服務器會在請求頭中返回cookie,cookie包含著這次登錄會話的session id青柄,在接下來的請求中只需要將登陸返回的cookie設置到請求頭中便可以通過驗證伐债。

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

如何做:

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

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控件塘辅,相當于一個瀏覽器客戶端晃虫。它會在本地維護每次會話的cookie(保存在data/data/package_name/app_WebView/Cookies.db)。
如圖:

查看APP cookie

當WebView加載URL的時候,WebView會從本地讀取該URL對應的cookie扣墩,并攜帶該cookie與服務器進行通信哲银。
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了。現(xiàn)在只需要獲得 CookieManager的對象將cookie設置進去就可以了。

第一步:登錄時從服務器的返回頭中取出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

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

查看WebView cookie

提示:

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

優(yōu)點:

  1. 方便结榄,只需要在登陸后將cookie同步到WebView即可中贝,省去了每次請求都需要設置一次的繁瑣。
  2. 兼容性好臼朗,因為是系統(tǒng)原生支持的邻寿,所以兼容性自然比方式一要好,不存在cookie被攔截的問題视哑。
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绣否,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖篮幢,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異淀弹,居然都是意外死亡,警方通過查閱死者的電腦和手機庆械,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門薇溃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缭乘,你說我怎么就攤上這事沐序。” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵策幼,是天一觀的道長邑时。 經(jīng)常有香客問我,道長特姐,這世上最難降的妖魔是什么晶丘? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮唐含,結果婚禮上浅浮,老公的妹妹穿的比我還像新娘。我一直安慰自己捷枯,他們只是感情好滚秩,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淮捆,像睡著了一般郁油。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上攀痊,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天桐腌,我揣著相機與錄音,去河邊找鬼蚕苇。 笑死,一個胖子當著我的面吹牛凿叠,可吹牛的內(nèi)容都是我干的涩笤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼盒件,長吁一口氣:“原來是場噩夢啊……” “哼蹬碧!你這毒婦竟也來了?” 一聲冷哼從身側響起炒刁,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤恩沽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后翔始,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罗心,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年城瞎,在試婚紗的時候發(fā)現(xiàn)自己被綠了渤闷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡脖镀,死狀恐怖飒箭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤弦蹂,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布肩碟,位于F島的核電站,受9級特大地震影響凸椿,放射性物質(zhì)發(fā)生泄漏削祈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一削饵、第九天 我趴在偏房一處隱蔽的房頂上張望岩瘦。 院中可真熱鬧,春花似錦窿撬、人聲如沸启昧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽密末。三九已至,卻和暖如春跛璧,著一層夾襖步出監(jiān)牢的瞬間严里,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工追城, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刹碾,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓座柱,卻偏偏與公主長得像迷帜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子色洞,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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

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