Cookie到底是什麼

2021-10-03 02:24:16 字數 3220 閱讀 4416

深入理解cookie,在原文基礎上做了一丟丟修改

朋友問我cookie是什麼,用來幹什麼的,可是我居然無法清楚明白簡短地向其闡述cookie,這不禁讓我陷入了沉思:為什麼我無法解釋清楚,我對學習的方法產生了懷疑!在知乎上看到有人推薦使用費爾曼學習技巧,於是在重新學習cookie的過程中使用了該技巧來試驗,效果有待驗證!

在學習乙個新的知識點前,我們應該明白自己的學習目標,要帶著疑問去學習,該小節須要了解:

什麼是cookie,cookie的作用

cookie的工作機制,即cookie的運作流程

cookie的基本屬性(4個)以及我們如何使用cookie

http協議本身是無狀態的。cookie實際上是一小段的文字資訊(key-value格式)。客戶端向伺服器發起請求,如果伺服器需要記錄該使用者狀態,就使用response向客戶端瀏覽器頒發乙個cookie。客戶端瀏覽器會把cookie儲存起來。當瀏覽器再請求該**時,瀏覽器把請求的**連同該cookie一同提交給伺服器。伺服器檢查該cookie,以此來辨認使用者狀態。

舉個栗子:我們去銀行辦理儲蓄業務,第一次給你辦了張銀行卡,裡面存放了身份證、密碼、手機等個人資訊。當你下次再來這個銀行時,銀行機器能識別你的卡,從而能夠直接辦理業務。

客戶端傳送乙個請求到伺服器—>伺服器傳送乙個httpresponse響應到客戶端,其中包含set-cookie的頭部—>客戶端儲存cookie,之後向伺服器傳送請求時,httprequest請求中會包含乙個cookie的頭部—>伺服器返回響應資料

為了**這個過程,寫了**進行測試,如下:

我在doget方法中,new了乙個cookie物件並將其加入到了httpresponse物件中

瀏覽器輸入位址進行訪問,結果如圖所示:

可見response headers中包含set-cookie頭部,而request headers中包含了cookie頭部。name和value正是上述設定的。

屬性項屬性項介紹

name=value

鍵值對,可以設定要儲存的 key/value,注意這裡的 name 不能和其他屬性項的名字一樣

expires

過期時間,在設定的某個時間點後該 cookie 就會失效

domain

生成該 cookie 的網域名稱,如 domain=「www.baidu.com」

path

該 cookie 是在當前的哪個路徑下生成的,如 path=/wp-admin/

secure

如果設定了這個屬性,那麼只會在 ssh 連線時才會回傳該 cookie

該屬性用來設定cookie的有效期。cookie中的maxage用來表示該屬性,單位為秒。cookie中通過getmaxage()和setmaxage(int maxage)來讀寫該屬性。maxage有3種值,分別為正數,負數和0

可以看到,當maxage為-1時,時間已經過期

req.

getcookies()

; cookie cookie = null;

// get cookie

for(cookie ck : cookies)}if

(null != cookie)

```

那麼maxage設定為負值和0到底有什麼區別呢?httpservletresponse提供的cookie操作只有乙個addcookie(cookie cookie),所以想要修改cookie只能使用乙個同名的cookie來覆蓋原先的cookie。如果要刪除某個cookie,則只需要新建乙個同名的cookie,並將maxage設定為0,並覆蓋原來的cookie即可

新建的cookie,除了value、maxage之外的屬性,比如name、path、domain都必須與原來的一致才能達到修改或者刪除的效果。否則,瀏覽器將視為兩個不同的cookie不予覆蓋。

值得注意的是,從客戶端讀取cookie時,包括maxage在內的其他屬性都是不可讀的,也不會被提交。瀏覽器提交cookie時只會提交name和value屬性,maxage屬性只被瀏覽器用來判斷cookie是否過期,而不能用服務端來判斷。

我們無法在服務端通過cookie.getmaxage()來判斷該cookie是否過期,maxage只是乙個唯讀屬性,值永遠為-1。當cookie過期時,瀏覽器在與後台互動時會自動篩選過期cookie,過期了的cookie就不會被攜帶了。

cookie是不可以跨網域名稱的,隱私安全機制禁止**非法獲取其他**的cookie。

正常情況下,同乙個一級網域名稱下的兩個二級網域名稱也不能互動使用cookie,比如 test1.mcrwayfun.com 和 test2.mcrwayfun.com,因為二者的網域名稱不完全相同。如果想要 mcrwayfun.com 名下的二級網域名稱都可以使用該cookie,需要設定cookie的domain引數為.mcrwayfun.com,這樣使用 test1.mcrwayfun.com 和 test2.mcrwayfun.com 就能訪問同乙個cookie

path屬性決定允許訪問cookie的路徑。比如,設定為"/"表示允許所有路徑都可以使用cookie

敏捷到底是什麼?

文 ivar jacobson 在支援軟體工程 比如rational統一過程rup 與敏捷陣營 比如scrum或是xp 之間,人們一直存在著衝突。也不難理解,因為這兩種方法間都是在用著彼此並不相容的方式來描述的。其實大可不必,因為他們背後的觀點全然是相輔相成的。關鍵在於該如何用對兩者來說都公平的方式...

我們到底是什麼?

我們到底是什麼?我們是一種生物電流 生物電流有幾種狀態,喜怒哀樂等,可以根據外部環境進行自我切換 該種生物電流附屬在一種器官硬體上面 我們可以從器官硬體上感知一些資訊,產生新的資訊生物電流,新產生的生物電流符合原先的標準 我們可以把資訊電流儲存在器官硬體上,但具體如何儲存等資訊無法被我們感知 我們的...

SDN到底是什麼

sdn到底是什麼?雖然這個概念已經被炒到了,但還沒有人對其給出乙個明確的概念。盛科網路總監張衛峰撰寫了自己關注sdn以來,對其認識的四個階段,最後乙個階段又回到了sdn字面的意思軟體定義網路,每個階段作者的新觀點,也會給我們帶來一些啟發。以下為原文 我對sdn的認識可以分為四個階段,最後乙個階段是在...