關于Cookie的思考
Cookie是什么?
Cookie產生的背景是源于年代并不久遠但是卻很經典的HTTP協議在互聯網上的急速發展。互聯網之所以成功很大程度上取決于傳輸協議HTTP協議的兩大特性:
1、 簡單。這個沒什么可多說的。簡單就是美,復雜的東西總是難以流行,想想古語所說陽春白雪和下里巴人就明白了。
2、 無狀態。無狀態意味著服務器可以滿足更多次的請求,這在成天嚷著要帶寬的互聯網發展初期是確保www成功的重要特性。
但是到了互聯網的深層次發展,帶寬等限制不存在了,人們需要更復雜的互聯網交互活動,就必須同服務器保持活動狀態。于是,在瀏覽器大發展初期,適應人民群眾的需求,技術上推出了各種保持web瀏覽狀態的手段,其中就包括了Cookie技術。
總體上,按照狀態保持存儲信息的主要位置來講,狀態保持分為:
1、 服務器端存儲狀態數據。如通常意義上的session
2、 客戶端保持存儲,cookie技術和web頁隱藏字段以及URL串存儲。都是主要數據存儲在客戶端或者發往客戶端的信息流中(HTML流),每一次客戶匯報存儲的數據提交給服務器,讓服務器知道自己上一次訪問服務器時候的狀態。
3、 第三地存儲。例如數據庫存儲會話數據,基本上是1的變種
cookie的存儲和傳輸
關于cookie的規范可以查找:
http://www.w3.org/Protocols/rfc2109/rfc2109.txt
cookie實際上是一段經過了編碼的字符串,具體來講存儲cookie的實際過程是以 key=value的形式存儲的,而且一個cookie為一個連續的字符串,每一個key之間“;”分隔,cookie之間則以#分割。
在Http的header中,cookie被傳輸,按照如下的格式:
set-cookie = "Set-Cookie:" cookies
cookies = 1#cookie
cookie = NAME "=" VALUE *(";" cookie-av)
NAME = attr
VALUE = value
cookie-av = "Comment" "=" value
| "Domain" "=" value
| "Max-Age" "=" value
| "Path" "=" value
| "Secure"
| "Version" "=" 1*DIGIT
Cookie是同站點密切相關的,也就說,你的站點發放的Cookie是不會通過IE/NE等發送給其他的站點。這些瀏覽器是通過web站點來區分的。具體的是host來區分的。但是如果你指定了domain的屬性,情況就不同了。那么只有指定domain的站點以及子站點(下級域名,注意還是域名)可以看到此cookie.
通常在IE中,Cookie是存放在IE進程的共享內存的。也就說,只要是統一進程的IE窗口,同一站點的cookie是共享的。
Cookie的消滅
直接給cookie賦””值是錯誤的,應當指示cookie的Max_age(ie是exprise)為一個過去值。譬如1980-1-1,這樣,瀏覽器發現了這樣的Cookie后就不會保存在內存中(更不會在輔存)這樣才算清掉了cookie。我今天就遇到了這樣的情形:
我在服務器端設置失效期限為當前時間(那么理論上當語句執行完畢cookie就已經過期了),但是發送回客戶端后,并沒有(客戶端時間之后服務期時間)。客戶瀏覽器會認為這個cookie還有效而繼續保持,在下一次提交時刻仍然提交到服務器,造成了邏輯處理上誤解。
引用一篇關于asp.net的cookie的技術文章
http://www.microsoft.com/china/msdn/library/webservices/asp.net/asppcookieless.mspx