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