朋友問我cookie是什麼,用來幹什麼的,可是我居然無法清楚明白簡短地向其闡述cookie,這不禁讓我陷入了沉思:為什麼我無法解釋清楚,我對學習的方法產生了懷疑!在知乎上看到有人推薦使用費爾曼學習技巧,於是在重新學習cookie的過程中使用了該技巧來試驗,效果有待驗證!
在學習乙個新的知識點前,我們應該明白自己的學習目標,要帶著疑問去學習,該小節須要了解:
1. 什麼是cookie,cookie的作用
2. cookie的工作機制,即cookie是運作流程
3. 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屬性為正數,則表示該cookie會在maxage秒之後自動失效。瀏覽器會將maxage為正數的cookie持久化,即寫到對應的cookie檔案中(每個瀏覽器儲存的位置不一致)。無論客戶關閉了瀏覽器還是電腦,只要還在maxage秒之前,登入**時該cookie仍然有效。下面**中的cookie資訊將永遠有效。
cookie cookie = new cookie("mcrwayfun",system.currenttimemillis()+"");
// 設定生命週期為max_value,永久有效
cookie.setmaxage(integer.max_value);
resp.addcookie(cookie);
當maxage屬性為負數,則表示該cookie只是乙個臨時cookie,不會被持久化,僅在本瀏覽器視窗或者本視窗開啟的子視窗中有效,關閉瀏覽器後該cookie立即失效。
cookie cookie = new cookie("mcrwayfun",system.currenttimemillis()+"");
// maxage為負數,是乙個臨時cookie,不會持久化
cookie.setmaxage(-1);
resp.addcookie(cookie);
可以看到,當maxage為-1時,時間已經過期
cookie cookies = req.getcookies();
cookie cookie = null;
// get cookie
for (cookie ck : cookies)
}if (null != cookie)
那麼maxage設定為負值和0到底有什麼區別呢?
maxage設定為負數,能看到expires屬性改變了,但cookie仍然會存在一段時間直到關閉瀏覽器或者重新開啟瀏覽器。
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
一級網域名稱又稱為頂級網域名稱,一般由字串+字尾組成。熟悉的一級網域名稱有baidu.com,qq.com。com,cn,net等均是常見的字尾。path屬性決定允許訪問cookie的路徑。比如,設定為」/」表示允許所有路徑都可以使用cook二級網域名稱是在一級網域名稱下衍生的,比如有個一級網域名稱為mcrfun.com,則blog.mcrfun.com和www.mcrfun.com均是其衍生出來的二級網域名稱。
深入了解A
一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...
深入了解A
一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...
深入了解Dojo Data
譯自http www.sitepen.com blog 2010 10 13 dive into dojo data 使用dojo data有助於快速建立web應用的介面,且易於嵌入各種資料來源。它在使用者介面與底層資料之間提供了一層抽象層,使得使用者介面開發人員能夠專注於ui的開發,而無需擔心資料...