HTTP cookies,通常又稱作"cookies"欢唾,已經(jīng)存在了很長時(shí)間礁遣,但是仍舊沒有被予以充分的理解。首要的問題是存在了諸多誤區(qū)杏头,認(rèn)為cookies是后門程序或病毒沸呐,或壓根不知道它是如何工作的。第二個(gè)問題是對(duì)于cookies缺少一個(gè)一致性的接口寓娩。盡管存在著這些問題滥朱,cookies仍舊在web開發(fā)中起著如此重要的作用力试,以至于如果cookie在沒有可替代品出現(xiàn)的情況下消失畸裳,我們?cè)S多喜歡的Web應(yīng)用將變得毫無用處。
cookies的起源
早期Web開發(fā)面臨的最大問題之一是如何管理狀態(tài)帅容。簡(jiǎn)言之伍伤,服務(wù)器端沒有辦法知道兩個(gè)請(qǐng)求是否來自于同一個(gè)瀏覽器。那時(shí)的辦法是在請(qǐng)求的頁面中插入一個(gè)token麦乞,并且在下一次請(qǐng)求中將這個(gè)token返回(至服務(wù)器)劝评。這就需要在form中插入一個(gè)包含token的隱藏表單域,或著在URL的qurey字符串中傳遞該token声畏。這兩種辦法都強(qiáng)調(diào)手工操作并且極易出錯(cuò)姻成。
LouMontulli,那時(shí)是網(wǎng)景通訊的一個(gè)雇員愿棋,被認(rèn)為在1994年將“magic cookies”的概念應(yīng)用到了web通訊中初斑。他意圖解決的是web中的購物車膨处,現(xiàn)在所有購物網(wǎng)站都依賴購物車。他的最早的說明文檔提供了一些cookies工作原理的基本信息該文檔在RFC2109中被規(guī)范化(這是所有瀏覽器實(shí)現(xiàn)cookies的參考依據(jù))鹃答,并且最終逐步形成了REF2965.Montulli最終也被授予了關(guān)于cookies的美國專利测摔。網(wǎng)景瀏覽器在它的第一個(gè)版本中就開始支持cookies解恰,并且當(dāng)前所有web瀏覽器都支持cookies。
cookie是什么挟纱?
坦白的說腐宋,一個(gè)cookie就是存儲(chǔ)在用戶主機(jī)瀏覽器中的一小段文本文件。Cookies是純文本形式欺嗤,它們不包含任何可執(zhí)行代碼卫枝。一個(gè)Web頁面或服務(wù)器告之瀏覽器來將這些信息存儲(chǔ)并且基于一系列規(guī)則在之后的每個(gè)請(qǐng)求中都將該信息返回至服務(wù)器校赤。Web服務(wù)器之后可以利用這些信息來標(biāo)識(shí)用戶。多數(shù)需要登錄的站點(diǎn)通常會(huì)在你的認(rèn)證信息通過后來設(shè)置一個(gè)cookie衰伯,之后只要這個(gè)cookie存在并且合法积蔚,你就可以自由的瀏覽這個(gè)站點(diǎn)的所有部分。再次怎顾,cookie只是包含了數(shù)據(jù),就其本身而言并不有害夭委。
Cookie總是保存在客戶端中募强,按在客戶端中的存儲(chǔ)位置擎值,可分為內(nèi)存Cookie和硬盤Cookie。內(nèi)存Cookie由瀏覽器維護(hù)屹蚊,保存在內(nèi)存中进每,瀏覽器關(guān)閉后就消失了,其存在時(shí)間是短暫的嘱兼。硬盤Cookie保存在硬盤里肉瓦,有一個(gè)過期時(shí)間泞莉,除非...
Cookie總是保存在客戶端中船殉,按在客戶端中的存儲(chǔ)位置,可分為內(nèi)存Cookie和硬盤Cookie挨厚。內(nèi)存Cookie由瀏覽器維護(hù)糠惫,保存在內(nèi)存中,瀏覽器關(guān)閉后就消失了巢价,其存在時(shí)間是短暫的。硬盤Cookie保存在硬盤里城菊,有一個(gè)過期時(shí)間凌唬,除非用戶手工清理或到了過期時(shí)間漏麦,硬盤Cookie不會(huì)被刪除,其存在時(shí)間是長期的霎挟。所以麻掸,按存在時(shí)間,可分為非持久Cookie和持久Cookie熬北。
1.cookie的屬性
一般cookie所具有的屬性诚隙,包括:
Domain:域久又,表示當(dāng)前cookie所屬于哪個(gè)域或子域下面。
此處需要額外注意的是炉峰,在C#中脉执,如果一個(gè)cookie不設(shè)置對(duì)應(yīng)的Domain半夷,那么在CookieContainer.Add(cookies)的時(shí)候,會(huì)死掉淘邻。對(duì)于服務(wù)器返回的Set-Cookie中湘换,如果沒有指定Domain的值宾舅,那么其Domain的值是默認(rèn)為當(dāng)前所提交的http的請(qǐng)求所對(duì)應(yīng)的主域名的敬尺。比如訪問 http://www.example.com,返回一個(gè)cookie贴浙,沒有指名domain值砂吞,那么其為值為默認(rèn)的www.example.com。
Path:表示cookie的所屬路徑崎溃。
Expire time/Max-age:表示了cookie的有效期蜻直。expire的值,是一個(gè)時(shí)間袁串,過了這個(gè)時(shí)間概而,該cookie就失效了〈研蓿或者是用max-age指定當(dāng)前cookie是在多長時(shí)間之后而失效。如果服務(wù)器返回的一個(gè)cookie破镰,沒有指定其expire time餐曼,那么表明此cookie有效期只是當(dāng)前的session,即是session cookie鲜漩,當(dāng)前session會(huì)話結(jié)束后源譬,就過期了。對(duì)應(yīng)的孕似,當(dāng)關(guān)閉(瀏覽器中)該頁面的時(shí)候踩娘,此cookie就應(yīng)該被瀏覽器所刪除了。
secure:表示該cookie只能用https傳輸喉祭。一般用于包含認(rèn)證信息的cookie养渴,要求傳輸此cookie的時(shí)候,必須用https傳輸泛烙。
httponly:表示此cookie必須用于http或https傳輸理卑。這意味著,瀏覽器腳本胶惰,比如javascript中傻工,是不允許訪問操作此cookie的霞溪。
2.服務(wù)器發(fā)送cookie給客戶端
從服務(wù)器端孵滞,發(fā)送cookie給客戶端,是對(duì)應(yīng)的Set-Cookie鸯匹。包括了對(duì)應(yīng)的cookie的名稱坊饶,值,以及各個(gè)屬性殴蓬。
例如:
Set-Cookie: lu=Rg3vHJZnehYLjVg7qi3bZjzg; Expires=Tue, 15 Jan 2013 21:47:38 GMT; Path=/; Domain=.169it.com; HttpOnly
Set-Cookie: made_write_conn=1295214458; Path=/; Domain=.169it.com
Set-Cookie: reg_fb_gate=deleted; Expires=Thu, 01 Jan 1970 00:00:01 GMT; Path=/; Domain=.169it.com; HttpOnly
3.從客戶端把cookie發(fā)送到服務(wù)器
從客戶端發(fā)送cookie給服務(wù)器的時(shí)候匿级,是不發(fā)送cookie的各個(gè)屬性的蟋滴,而只是發(fā)送對(duì)應(yīng)的名稱和值。
例如:
GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: name=value; name2=value2
Accept: */*
4.關(guān)于修改痘绎,設(shè)置cookie
除了服務(wù)器發(fā)送給客戶端(瀏覽器)的時(shí)候津函,通過Set-Cookie,創(chuàng)建或更新對(duì)應(yīng)的cookie之外孤页,還可以通過瀏覽器內(nèi)置的一些腳本尔苦,比如javascript,去設(shè)置對(duì)應(yīng)的cookie行施,對(duì)應(yīng)實(shí)現(xiàn)是操作js中的document.cookie允坚。
5.Cookie的缺陷
(1)cookie會(huì)被附加在每個(gè)HTTP請(qǐng)求中,所以無形中增加了流量蛾号。
(2)由于在HTTP請(qǐng)求中的cookie是明文傳遞的稠项,所以安全性成問題。(除非用HTTPS)
(3)Cookie的大小限制在4KB左右鲜结。對(duì)于復(fù)雜的存儲(chǔ)需求來說是不夠用的展运。
轉(zhuǎn)載 -- http://www.169it.com/article/3217120921.html