深入理解Cookie

j-kelly-brito-416262-unsplash.jpg

1. 前言

朋友問我cookie是什么聚至,用來干什么的,可是我居然無法清楚明白簡短地向其闡述cookie雀哨,這不禁讓我陷入了沉思:為什么我無法解釋清楚固额,我對學(xué)習(xí)的方法產(chǎn)生了懷疑眠蚂!在知乎上看到有人推薦使用費爾曼學(xué)習(xí)技巧,于是在重新學(xué)習(xí)cookie的過程中使用了該技巧來試驗斗躏,效果有待驗證逝慧!

在學(xué)習(xí)一個新的知識點前,我們應(yīng)該明白自己的學(xué)習(xí)目標(biāo)瑟捣,要帶著疑問去學(xué)習(xí)馋艺,該小節(jié)須要了解:

  1. 什么是cookie,cookie的作用
  2. cookie的工作機(jī)制迈套,即cookie是運作流程
  3. cookie的基本屬性(4個)以及我們?nèi)绾问褂胏ookie

2. 什么是cookie

HTTP協(xié)議本身是無狀態(tài)的捐祠。什么是無狀態(tài)呢,即服務(wù)器無法判斷用戶身份桑李。Cookie實際上是一小段的文本信息(key-value格式)踱蛀。客戶端向服務(wù)器發(fā)起請求贵白,如果服務(wù)器需要記錄該用戶狀態(tài)率拒,就使用response向客戶端瀏覽器頒發(fā)一個Cookie〗模客戶端瀏覽器會把Cookie保存起來猬膨。當(dāng)瀏覽器再請求該網(wǎng)站時,瀏覽器把請求的網(wǎng)址連同該Cookie一同提交給服務(wù)器呛伴。服務(wù)器檢查該Cookie勃痴,以此來辨認(rèn)用戶狀態(tài)谒所。

打個比方,我們?nèi)ャy行辦理儲蓄業(yè)務(wù)沛申,第一次給你辦了張銀行卡劣领,里面存放了身份證、密碼铁材、手機(jī)等個人信息尖淘。當(dāng)你下次再來這個銀行時,銀行機(jī)器能識別你的卡著觉,從而能夠直接辦理業(yè)務(wù)村生。

3. cookie機(jī)制

當(dāng)用戶第一次訪問并登陸一個網(wǎng)站的時候,cookie的設(shè)置以及發(fā)送會經(jīng)歷以下4個步驟:

客戶端發(fā)送一個請求到服務(wù)器 --》 服務(wù)器發(fā)送一個HttpResponse響應(yīng)到客戶端固惯,其中包含Set-Cookie的頭部 --》 客戶端保存cookie梆造,之后向服務(wù)器發(fā)送請求時缴守,HttpRequest請求中會包含一個Cookie的頭部 --》服務(wù)器返回響應(yīng)數(shù)據(jù)

image

為了探究這個過程葬毫,寫了代碼進(jìn)行測試,如下:

我在doGet方法中屡穗,new了一個Cookie對象并將其加入到了HttpResponse對象中

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Cookie cookie = new Cookie("mcrwayfun",System.currentTimeMillis()+"");
        // 設(shè)置生命周期為MAX_VALUE
        cookie.setMaxAge(Integer.MAX_VALUE);
        resp.addCookie(cookie);
    }

瀏覽器輸入地址進(jìn)行訪問贴捡,結(jié)果如圖所示:

image

可見Response Headers中包含Set-Cookie頭部,而Request Headers中包含了Cookie頭部村砂。name和value正是上述設(shè)置的烂斋。

4. cookie屬性項

屬性項 屬性項介紹
NAME=VALUE 鍵值對,可以設(shè)置要保存的 Key/Value础废,注意這里的 NAME 不能和其他屬性項的名字一樣
Expires 過期時間汛骂,在設(shè)置的某個時間點后該 Cookie 就會失效
Domain 生成該 Cookie 的域名,如 domain="www.baidu.com"
Path 該 Cookie 是在當(dāng)前的哪個路徑下生成的评腺,如 path=/wp-admin/
Secure 如果設(shè)置了這個屬性帘瞭,那么只會在 SSH 連接時才會回傳該 Cookie

Expires

該屬性用來設(shè)置Cookie的有效期。Cookie中的maxAge用來表示該屬性蒿讥,單位為秒蝶念。Cookie中通過getMaxAge()和setMaxAge(int maxAge)來讀寫該屬性。maxAge有3種值芋绸,分別為正數(shù)媒殉,負(fù)數(shù)和0。

如果maxAge屬性為正數(shù)摔敛,則表示該Cookie會在maxAge秒之后自動失效廷蓉。瀏覽器會將maxAge為正數(shù)的Cookie持久化,即寫到對應(yīng)的Cookie文件中(每個瀏覽器存儲的位置不一致)马昙。無論客戶關(guān)閉了瀏覽器還是電腦桃犬,只要還在maxAge秒之前售貌,登錄網(wǎng)站時該Cookie仍然有效。下面代碼中的Cookie信息將永遠(yuǎn)有效疫萤。

        Cookie cookie = new Cookie("mcrwayfun",System.currentTimeMillis()+"");
        // 設(shè)置生命周期為MAX_VALUE颂跨,永久有效
        cookie.setMaxAge(Integer.MAX_VALUE);
        resp.addCookie(cookie);

當(dāng)maxAge屬性為負(fù)數(shù),則表示該Cookie只是一個臨時Cookie扯饶,不會被持久化恒削,僅在本瀏覽器窗口或者本窗口打開的子窗口中有效,關(guān)閉瀏覽器后該Cookie立即失效尾序。

        Cookie cookie = new Cookie("mcrwayfun",System.currentTimeMillis()+"");
        // MaxAge為負(fù)數(shù)钓丰,是一個臨時Cookie,不會持久化
        cookie.setMaxAge(-1);
        resp.addCookie(cookie);

可以看到每币,當(dāng)MaxAge為-1時携丁,時間已經(jīng)過期

image

當(dāng)maxAge為0時,表示立即刪除Cookie

        Cookie[] cookies = req.getCookies();
        Cookie cookie = null;

        // get Cookie
        for (Cookie ck : cookies) {

            if ("mcrwayfun".equals(ck.getName())) {
                cookie = ck;
                break;
            }
        }

        if (null != cookie) {
            // 刪除一個cookie
            cookie.setMaxAge(0);
            resp.addCookie(cookie);
        }

那么maxAge設(shè)置為負(fù)值和0到底有什么區(qū)別呢兰怠?

maxAge設(shè)置為0表示立即刪除該Cookie梦鉴,如果在debug的模式下,執(zhí)行上述方法揭保,可以看見cookie立即被刪除了肥橙。

image

maxAge設(shè)置為負(fù)數(shù),能看到Expires屬性改變了秸侣,但Cookie仍然會存在一段時間直到關(guān)閉瀏覽器或者重新打開瀏覽器存筏。

image

修改或者刪除Cookie

HttpServletResponse提供的Cookie操作只有一個addCookie(Cookie cookie),所以想要修改Cookie只能使用一個同名的Cookie來覆蓋原先的Cookie味榛。如果要刪除某個Cookie椭坚,則只需要新建一個同名的Cookie,并將maxAge設(shè)置為0搏色,并覆蓋原來的Cookie即可善茎。

新建的Cookie,除了value继榆、maxAge之外的屬性巾表,比如name、path略吨、domain都必須與原來的一致才能達(dá)到修改或者刪除的效果集币。否則,瀏覽器將視為兩個不同的Cookie不予覆蓋翠忠。

值得注意的是鞠苟,從客戶端讀取Cookie時,包括maxAge在內(nèi)的其他屬性都是不可讀的,也不會被提交当娱。瀏覽器提交Cookie時只會提交name和value屬性吃既,maxAge屬性只被瀏覽器用來判斷Cookie是否過期,而不能用服務(wù)端來判斷跨细。

image

我們無法在服務(wù)端通過cookie.getMaxAge()來判斷該cookie是否過期鹦倚,maxAge只是一個只讀屬性,值永遠(yuǎn)為-1冀惭。當(dāng)cookie過期時震叙,瀏覽器在與后臺交互時會自動篩選過期cookie,過期了的cookie就不會被攜帶了散休。

Cookie的域名

Cookie是不可以跨域名的媒楼,隱私安全機(jī)制禁止網(wǎng)站非法獲取其他網(wǎng)站的Cookie。

正常情況下戚丸,同一個一級域名下的兩個二級域名也不能交互使用Cookie划址,比如test1.mcrwayfun.com和test2.mcrwayfun.com,因為二者的域名不完全相同限府。如果想要mcrwayfun.com名下的二級域名都可以使用該Cookie夺颤,需要設(shè)置Cookie的domain參數(shù)為.mcrwayfun.com,這樣使用test1.mcrwayfun.com和test2.mcrwayfun.com就能訪問同一個cookie

一級域名又稱為頂級域名谣殊,一般由字符串+后綴組成拂共。熟悉的一級域名有baidu.com,qq.com姻几。com,cn势告,net等均是常見的后綴蛇捌。
二級域名是在一級域名下衍生的,比如有個一級域名為mcrfun.com咱台,則blog.mcrfun.comwww.mcrfun.com均是其衍生出來的二級域名络拌。

Cookie的路徑

path屬性決定允許訪問Cookie的路徑。比如回溺,設(shè)置為"/"表示允許所有路徑都可以使用Cookie

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末春贸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子遗遵,更是在濱河造成了極大的恐慌萍恕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件车要,死亡現(xiàn)場離奇詭異允粤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門类垫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來司光,“玉大人,你說我怎么就攤上這事悉患〔屑遥” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵售躁,是天一觀的道長跪削。 經(jīng)常有香客問我,道長迂求,這世上最難降的妖魔是什么碾盐? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮揩局,結(jié)果婚禮上毫玖,老公的妹妹穿的比我還像新娘。我一直安慰自己凌盯,他們只是感情好付枫,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驰怎,像睡著了一般阐滩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上县忌,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天掂榔,我揣著相機(jī)與錄音,去河邊找鬼症杏。 笑死装获,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的厉颤。 我是一名探鬼主播穴豫,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逼友!你這毒婦竟也來了精肃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤帜乞,失蹤者是張志新(化名)和其女友劉穎司抱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挖函,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡状植,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年浊竟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片津畸。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡畦徘,死狀恐怖狂秦,靈堂內(nèi)的尸體忽然破棺而出逢享,到底是詐尸還是另有隱情竞穷,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布暖途,位于F島的核電站卑惜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏驻售。R本人自食惡果不足惜露久,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望欺栗。 院中可真熱鬧毫痕,春花似錦、人聲如沸迟几。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽类腮。三九已至臊泰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚜枢,已是汗流浹背缸逃。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留祟偷,地道東北人察滑。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像修肠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子户盯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

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

  • 目錄Cookie機(jī)制什么是CookieCookie的不可跨域名性Unicode編碼:保存中文BASE64編碼:保存...
    Tomatoro閱讀 16,946評論 7 186
  • 會話(Session)跟蹤是Web程序中常用的技術(shù)嵌施,用來跟蹤用戶的整個會話。常用的會話跟蹤技術(shù)是Cookie與Se...
    chinariver閱讀 5,620評論 1 49
  • Cookie技術(shù)是客戶端的解決方案莽鸭,Cookie就是由服務(wù)器發(fā)給客戶端的特殊信息吗伤,而這些信息以文本文件的方式存放在...
    饑人谷_陸邈閱讀 1,476評論 1 5
  • server:本demo開發(fā)工具采用springSTS前提讀寫分離庫已經(jīng)搭建好1.首先新建一個springboot...
    布衣小販java閱讀 9,211評論 2 9
  • 昨天是我參加好報寫作后第一次未交作業(yè),多少有點慚愧硫眨。其實通過自愿加入寫作并能每天堅持寫足淆,多少還是需要自己的自覺。可...
    破曉天晴閱讀 315評論 0 0