Android學(xué)習(xí)-WebView設(shè)置Cookie注意事項

在WebView訪問不同網(wǎng)址時,通常我們對具有相同域的Url有著種Cookie的需求刨肃,方便后續(xù)的客戶端與服務(wù)器的交互,省略用戶反復(fù)操作的過程箩帚。
為了達到這個目的真友,我們往往使用安卓提供的CookieManager類中的setCookie(String url, String value)方法來對url的Cookie進行設(shè)置。
首先看一下該方法的注釋:

/**
* 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
* will be ignored if it is expired.
*
* @param url the URL for which the cookie is to be set
* @param value the cookie as a string, using the format of the 'Set-Cookie'
* HTTP response header
*/
public abstract void setCookie(String url, String value);

該注釋說明了使用該方法時的兩點信息:

  1. 只有host紧帕,path和name相同的cookie才是相同的cookie马篮,才會在設(shè)置的時候覆蓋原有的cookie。否則經(jīng)測會并列存儲在cookie列表中豌习。
  2. 被設(shè)置的cookie如果已經(jīng)過期則可以忽略步责。

我們使用這兩個特點可以解決兩個問題:

  • 什么情況下一個cookie才可以被使用在URL的訪問中
  • 如何將特定的cookie在setCookie保存后并刪除

首先來解決第一個問題。

我們在WebView中使用Cookie時會偶爾失效鹅搪,這是為什么呢站绪?

我們要搞清楚,在Cookie中丽柿,host和path的意義是什么

  1. domain(host)表示的是cookie所在的域恢准,默認為請求的地址,如網(wǎng)址為www.test.com/test/test.aspx甫题,那么domain默認為www.test.com馁筐。而跨域訪問,如域A為t1.test.com坠非,域B為t2.test.com敏沉,那么在域A生產(chǎn)一個令域A和域B都能訪問的cookie就要將該cookie的domain設(shè)置為.test.com;如果要在域A生產(chǎn)一個令域A不能訪問而域B能訪問的cookie就要將該cookie的domain設(shè)置為t2.test.com

  2. path表示cookie所在的目錄赦抖,asp.net默認為/舱卡,就是根目錄。在同一個服務(wù)器上有目錄如下:/test/,/test/cd/,/test/dd/队萤,現(xiàn)設(shè)一個cookie1的path為/test/轮锥,cookie2的path為/test/cd/,那么test下的所有頁面都可以訪問到cookie1要尔,而/test/和/test/dd/的子頁面不能訪問cookie2舍杜。這是因為cookie能讓其path路徑下的頁面訪問。

在這里引入我所遇見的問題赵辕,比如我想訪問一個URL:
String url = "www.baidu.com/test/app/";
已知用戶的session值既绩,所以我對該URL進行setCookie操作:
setCookie(url, "session=" + getSession());

這時存儲Cookie的數(shù)據(jù)表中的這一條Cookie存儲情況為

creation_utc host_key name value path expires_utc secure httponly last_access_utc has_expires persistent priority encrypted_value firstpartyonly
13171714776494734 www.baidu.com session 11111111 /test/app 0 0 0 13171714776494734 0 0 1 (數(shù)據(jù)) 0

我們可以看到,默認的host和path都是根據(jù)url進行判斷和存儲的还惠,這樣就會帶來一個問題饲握。如果我們想對相同host下的url都種上Cookie,那么這種path受限的Cookie是肯定不好使的蚕键,上面第二條也講過了救欧。
所以我們需要將Path設(shè)置為"path = /",這樣根目錄下的訪問就都可以使用這個Cookie了锣光,即修改上述設(shè)定Cookie的代碼為
setCookie(url, "session=" + getSession() + ";max-age=2534023007" + ";domain=" + host + ";path = /");

這里我們只關(guān)注最關(guān)鍵的path的設(shè)置就可以笆怠,接下來分析Cookie的過期機制。

第二個問題誊爹,Cookie的過期機制

首先我們在設(shè)置Cookie的時候蹬刷,可以設(shè)置Cookie的生效時間,字段名為expires或max-age频丘。前者為過期的時間點办成,后者為生效的持續(xù)時間,單位為秒搂漠。

在這里說幾個實驗結(jié)果:

  • 如果將cookie的max-age設(shè)置為負數(shù)诈火,或者將expires字段設(shè)置為過期的時間點,數(shù)據(jù)庫更新后這條cookie將從數(shù)據(jù)庫中被刪除

  • 如果將cookie的max-age和expires字段設(shè)置為正常的過期日期状答,則到期后在數(shù)據(jù)庫更新時會刪除該條數(shù)據(jù)

(筆者在這里嘗試了setCookie和getCookie兩種方法,都造成了數(shù)據(jù)庫的更新〉堆拢現(xiàn)在CookieManager已經(jīng)可以自動sync惊科,不需要強制sync)

所以如果我們想刪除數(shù)據(jù)庫中的某條Cookie,直接將它的時間設(shè)置為過期即可亮钦。

還需要注意一點

在更新Cookie時馆截,只有host,name(也就是key),path都相同時才會更新該條cookie蜡娶,否則只會在數(shù)據(jù)庫中增加新的條目混卵。

注:上文中有不少實驗結(jié)果,關(guān)于安卓API具體操作細節(jié)還需要查看代碼窖张,這也是筆者下一步需要做的事情幕随。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市宿接,隨后出現(xiàn)的幾起案子赘淮,更是在濱河造成了極大的恐慌,老刑警劉巖睦霎,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梢卸,死亡現(xiàn)場離奇詭異,居然都是意外死亡副女,警方通過查閱死者的電腦和手機蛤高,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碑幅,“玉大人戴陡,你說我怎么就攤上這事≌碚裕” “怎么了猜欺?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拷窜。 經(jīng)常有香客問我开皿,道長,這世上最難降的妖魔是什么篮昧? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任赋荆,我火速辦了婚禮,結(jié)果婚禮上懊昨,老公的妹妹穿的比我還像新娘窄潭。我一直安慰自己,他們只是感情好酵颁,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布嫉你。 她就那樣靜靜地躺著,像睡著了一般躏惋。 火紅的嫁衣襯著肌膚如雪幽污。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天簿姨,我揣著相機與錄音距误,去河邊找鬼簸搞。 笑死,一個胖子當著我的面吹牛准潭,可吹牛的內(nèi)容都是我干的趁俊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼刑然,長吁一口氣:“原來是場噩夢啊……” “哼寺擂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起闰集,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤沽讹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后武鲁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爽雄,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年沐鼠,在試婚紗的時候發(fā)現(xiàn)自己被綠了挚瘟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡饲梭,死狀恐怖乘盖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情憔涉,我是刑警寧澤订框,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站兜叨,受9級特大地震影響穿扳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜国旷,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一矛物、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跪但,春花似錦履羞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至被环,卻和暖如春雄卷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛤售。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悴能。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓揣钦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親漠酿。 傳聞我的和親對象是個殘疾皇子冯凹,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)炒嘲,斷路器宇姚,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 目錄Cookie機制什么是CookieCookie的不可跨域名性Unicode編碼:保存中文BASE64編碼:保存...
    Tomatoro閱讀 16,925評論 7 186
  • 會話(Session)跟蹤是Web程序中常用的技術(shù),用來跟蹤用戶的整個會話夫凸。常用的會話跟蹤技術(shù)是Cookie與Se...
    chinariver閱讀 5,599評論 1 49
  • Cookie技術(shù)是客戶端的解決方案浑劳,Cookie就是由服務(wù)器發(fā)給客戶端的特殊信息,而這些信息以文本文件的方式存放在...
    饑人谷_陸邈閱讀 1,453評論 1 5
  • 一夭拌、概念棧:棧是一個先進后出的線性表魔熏,它要求只在表尾進行刪除和插入等操作。 所以棧其實就是一個線性表鸽扁,不過操作有特...
    翼動晴空閱讀 973評論 0 0