關(guān)于對(duì)Cookie的理解

Cookie技術(shù)是客戶端的解決方案,Cookie就是由服務(wù)器發(fā)給客戶端的特殊信息毯焕,而這些信息以文本文件的方式存放在客戶端,然后客戶端每次向服務(wù)器發(fā)送請(qǐng)求的時(shí)候都會(huì)帶上這些特殊的信息。讓我們說(shuō)得更具體一些:當(dāng)用戶使用瀏覽器訪問(wèn)一個(gè)支持Cookie的網(wǎng)站的時(shí)候纳猫,用戶會(huì)提供包括用戶名在內(nèi)的個(gè)人信息并且提交至服務(wù)器婆咸;接著,服務(wù)器在向客戶端回傳相應(yīng)的超文本的同時(shí)也會(huì)發(fā)回這些個(gè)人信息芜辕,當(dāng)然這些信息并不是存放在HTTP響應(yīng)體(Response Body)中的尚骄,而是存放于HTTP響應(yīng)頭(Response Header);當(dāng)客戶端瀏覽器接收到來(lái)自服務(wù)器的響應(yīng)之后侵续,瀏覽器會(huì)將這些信息存放在一個(gè)統(tǒng)一的位置倔丈,對(duì)于Windows操作系統(tǒng)而言,我們可以從:?[系統(tǒng)盤]:\Documents and Settings[用戶名]\Cookies目錄中找到存儲(chǔ)的Cookie状蜗;自此需五,客戶端再向服務(wù)器發(fā)送請(qǐng)求的時(shí)候,都會(huì)把相應(yīng)的Cookie再次發(fā)回至服務(wù)器轧坎。而這次宏邮,Cookie信息則存放在HTTP請(qǐng)求頭(Request Header)了。有了Cookie這樣的技術(shù)實(shí)現(xiàn)缸血,服務(wù)器在接收到來(lái)自客戶端瀏覽器的請(qǐng)求之后蜜氨,就能夠通過(guò)分析存放于請(qǐng)求頭的Cookie得到客戶端特有的信息,從而動(dòng)態(tài)生成與該客戶端相對(duì)應(yīng)的內(nèi)容捎泻。通常飒炎,我們可以從很多網(wǎng)站的登錄界面中看到“請(qǐng)記住我”這樣的選項(xiàng),如果你勾選了它之后再登錄族扰,那么在下一次訪問(wèn)該網(wǎng)站的時(shí)候就不需要進(jìn)行重復(fù)而繁瑣的登錄動(dòng)作了厌丑,而這個(gè)功能就是通過(guò)Cookie實(shí)現(xiàn)的。

在程序中渔呵,會(huì)話跟蹤是很重要的事情怒竿。理論上,一個(gè)用戶的所有請(qǐng)求操作都應(yīng)該屬于同一個(gè)會(huì)話扩氢,而另一個(gè)用戶的所有請(qǐng)求操作則應(yīng)該屬于另一個(gè)會(huì)話耕驰,二者不能混淆。例如录豺,用戶A在超市購(gòu)買的任何商品都應(yīng)該放在A的購(gòu)物車內(nèi)朦肘,不論是用戶A什么時(shí)間購(gòu)買的,這都是屬于同一個(gè)會(huì)話的双饥,不能放入用戶B或用戶C的購(gòu)物車內(nèi)媒抠,這不屬于同一個(gè)會(huì)話。

而Web應(yīng)用程序是使用HTTP協(xié)議傳輸數(shù)據(jù)的咏花。HTTP協(xié)議是無(wú)狀態(tài)的協(xié)議趴生。一旦數(shù)據(jù)交換完畢阀趴,客戶端與服務(wù)器端的連接就會(huì)關(guān)閉,再次交換數(shù)據(jù)需要建立新的連接苍匆。這就意味著服務(wù)器無(wú)法從連接上跟蹤會(huì)話刘急。即用戶A購(gòu)買了一件商品放入購(gòu)物車內(nèi),當(dāng)再次購(gòu)買商品時(shí)服務(wù)器已經(jīng)無(wú)法判斷該購(gòu)買行為是屬于用戶A的會(huì)話還是用戶B的會(huì)話了浸踩。要跟蹤該會(huì)話叔汁,必須引入一種機(jī)制。

Cookie就是這樣的一種機(jī)制检碗。它可以彌補(bǔ)HTTP協(xié)議無(wú)狀態(tài)的不足据块。在Session出現(xiàn)之前,基本上所有的網(wǎng)站都采用Cookie來(lái)跟蹤會(huì)話折剃。

如果你把Cookies看成為http協(xié)議的一個(gè)擴(kuò)展的話瑰钮,理解起來(lái)就容易的多了,其實(shí)本質(zhì)上cookies就是http的一個(gè)擴(kuò)展微驶。有兩個(gè)http頭部是專門負(fù)責(zé)設(shè)置以及發(fā)送cookie的,它們分別是Set-Cookie以及Cookie。當(dāng)服務(wù)器返回給客戶端一個(gè)http響應(yīng)信息時(shí)开睡,其中如果包含Set-Cookie這個(gè)頭部時(shí)因苹,意思就是指示客戶端建立一個(gè)cookie,并且在后續(xù)的http請(qǐng)求中自動(dòng)發(fā)送這個(gè)cookie到服務(wù)器端篇恒,直到這個(gè)cookie過(guò)期扶檐。如果cookie的生存時(shí)間是整個(gè)會(huì)話期間的話,那么瀏覽器會(huì)將cookie保存在內(nèi)存中胁艰,瀏覽器關(guān)閉時(shí)就會(huì)自動(dòng)清除這個(gè)cookie款筑。另外一種情況就是保存在客戶端的硬盤中,瀏覽器關(guān)閉的話腾么,該cookie也不會(huì)被清除奈梳,下次打開瀏覽器訪問(wèn)對(duì)應(yīng)網(wǎng)站時(shí),這個(gè)cookie就會(huì)自動(dòng)再次發(fā)送到服務(wù)器端解虱。一個(gè)cookie的設(shè)置以及發(fā)送過(guò)程分為以下四步:

客戶端發(fā)送一個(gè)http請(qǐng)求到服務(wù)器端 服務(wù)器端發(fā)送一個(gè)http響應(yīng)到客戶端攘须,其中包含Set-Cookie頭部 客戶端發(fā)送一個(gè)http請(qǐng)求到服務(wù)器端,其中包含Cookie頭部 服務(wù)器端發(fā)送一個(gè)http響應(yīng)到客戶端

這個(gè)通訊過(guò)程也可以用以下下示意圖來(lái)描述:


在客戶端的第二次請(qǐng)求中包含的Cookie頭部中殴泰,提供給了服務(wù)器端可以用來(lái)唯一標(biāo)識(shí)客戶端身份的信息于宙。這時(shí),服務(wù)器端也就可以判斷客戶端是否啟用了cookies悍汛。盡管捞魁,用戶可能在和應(yīng)用程序交互的過(guò)程中突然禁用cookies的使用,但是离咐,這個(gè)情況基本是不太可能發(fā)生的谱俭,所以可以不加以考慮,這在實(shí)踐中也被證明是對(duì)的。

除了cookies,客戶端還可以將發(fā)送給服務(wù)器的數(shù)據(jù)包含在請(qǐng)求的url中旺上,比如請(qǐng)求的參數(shù)或者請(qǐng)求的路徑中瓶蚂。 我們來(lái)看一個(gè)常規(guī)的http get 請(qǐng)求例子:

GET /index.php?foo=bar HTTP/1.1 Host: example.org

另外一種客戶端傳遞數(shù)據(jù)到服務(wù)器端的方式是將數(shù)據(jù)包含在http請(qǐng)求的內(nèi)容區(qū)域內(nèi)。 這種方式需要請(qǐng)求的類型是POST的宣吱,看下面一個(gè)例子:

POST /index.php HTTP/1.1 Host: example.org Content-Type: application/x-www-form-urlencoded Content-Length: 7

foo=bar

在一個(gè)請(qǐng)求中窃这,可以同時(shí)包含這兩種形式的數(shù)據(jù):

POST /index.php?myget=foo HTTP/1.1 Host: example.orgContent-Type: application/x-www-form-urlencoded Content-Length: 11

mypost=bar

這兩種傳遞數(shù)據(jù)的方式,比起用cookies來(lái)傳遞數(shù)據(jù)更穩(wěn)定征候,因?yàn)閏ookie可能被禁用杭攻,但是以GET以及POST方式傳遞數(shù)據(jù)時(shí),不存在這種情況疤坝。我們可以將PHPSESSID包含在http請(qǐng)求的url中兆解,就像下面的例子一樣:

GET /index.php?PHPSESSID=12345 HTTP/1.1 Host: example.org

什么是Cookie

Cookie意為“甜餅”,是由W3C組織提出跑揉,最早由Netscape社區(qū)發(fā)展的一種機(jī)制锅睛。目前Cookie已經(jīng)成為標(biāo)準(zhǔn),所有的主流瀏覽器如IE历谍、Netscape现拒、Firefox、Opera等都支持Cookie望侈。

由于HTTP是一種無(wú)狀態(tài)的協(xié)議印蔬,服務(wù)器單從網(wǎng)絡(luò)連接上無(wú)從知道客戶身份。怎么辦呢脱衙?就給客戶端們頒發(fā)一個(gè)通行證吧侥猬,每人一個(gè),無(wú)論誰(shuí)訪問(wèn)都必須攜帶自己通行證捐韩。這樣服務(wù)器就能從通行證上確認(rèn)客戶身份了退唠。這就是Cookie的工作原理。

Cookie實(shí)際上是一小段的文本信息奥帘⊥剩客戶端請(qǐng)求服務(wù)器,如果服務(wù)器需要記錄該用戶狀態(tài)寨蹋,就使用response向客戶端瀏覽器頒發(fā)一個(gè)Cookie松蒜。客戶端瀏覽器會(huì)把Cookie保存起來(lái)已旧。當(dāng)瀏覽器再請(qǐng)求該網(wǎng)站時(shí)秸苗,瀏覽器把請(qǐng)求的網(wǎng)址連同該Cookie一同提交給服務(wù)器。服務(wù)器檢查該Cookie运褪,以此來(lái)辨認(rèn)用戶狀態(tài)惊楼。服務(wù)器還可以根據(jù)需要修改Cookie的內(nèi)容玖瘸。


查看某個(gè)網(wǎng)站頒發(fā)的Cookie很簡(jiǎn)單。在瀏覽器地址欄輸入javascript:alert (document. cookie)就可以了(需要有網(wǎng)才能查看)檀咙。JavaScript腳本會(huì)彈出一個(gè)對(duì)話框顯示本網(wǎng)站頒發(fā)的所有Cookie的內(nèi)容雅倒,如圖所示。


上圖中彈出的對(duì)話框中顯示的為Baidu網(wǎng)站的Cookie弧可。其中第一行BAIDUID記錄的就是筆者的身份helloweenvsfei蔑匣,只是Baidu使用特殊的方法將Cookie信息加密了。

注意:Cookie功能需要瀏覽器的支持棕诵。如果瀏覽器不支持Cookie(如大部分手機(jī)中的瀏覽器)或者把Cookie禁用了裁良,Cookie功能就會(huì)失效。不同的瀏覽器采用不同的方式保存Cookie校套。IE瀏覽器會(huì)在“C:\Documents and Settings\你的用戶名\Cookies”文件夾下以文本文件形式保存价脾,一個(gè)文本文件保存一個(gè)Cookie。

記錄用戶訪問(wèn)次數(shù)

Java中把Cookie封裝成了javax.servlet.http.Cookie類笛匙。每個(gè)Cookie都是該Cookie類的對(duì)象侨把。服務(wù)器通過(guò)操作Cookie類對(duì)象對(duì)客戶端Cookie進(jìn)行操作。通過(guò)request.getCookie()獲取客戶端提交的所有Cookie(以Cookie[]數(shù)組形式返回)妹孙,通過(guò)response.addCookie(Cookie cookie)向客戶端設(shè)置Cookie座硕。

Cookie對(duì)象使用key-value屬性對(duì)的形式保存用戶狀態(tài),一個(gè)Cookie對(duì)象保存一個(gè)屬性對(duì)涕蜂,一個(gè)request或者response同時(shí)使用多個(gè)Cookie。因?yàn)镃ookie類位于包javax.servlet.http.*下面映琳,所以JSP中不需要import該類机隙。

Cookie的不可跨域名性

很多網(wǎng)站都會(huì)使用Cookie。例如萨西,Google會(huì)向客戶端頒發(fā)Cookie有鹿,Baidu也會(huì)向客戶端頒發(fā)Cookie。那瀏覽器訪問(wèn)Google會(huì)不會(huì)也攜帶上Baidu頒發(fā)的Cookie呢谎脯?或者Google能不能修改Baidu頒發(fā)的Cookie呢葱跋?

答案是否定的。Cookie具有不可跨域名性源梭。根據(jù)Cookie規(guī)范,瀏覽器訪問(wèn)Google只會(huì)攜帶Google的Cookie,而不會(huì)攜帶Baidu的Cookie婉弹。Google也只能操作Google的Cookie列林,而不能操作Baidu的Cookie。

Cookie在客戶端是由瀏覽器來(lái)管理的烛愧。瀏覽器能夠保證Google只會(huì)操作Google的Cookie而不會(huì)操作Baidu的Cookie油宜,從而保證用戶的隱私安全掂碱。瀏覽器判斷一個(gè)網(wǎng)站是否能操作另一個(gè)網(wǎng)站Cookie的依據(jù)是域名。Google與Baidu的域名不一樣慎冤,因此Google不能操作Baidu的Cookie疼燥。

需要注意的是,雖然網(wǎng)站images.google.com與網(wǎng)站www.google.com同屬于Google蚁堤,但是域名不一樣醉者,二者同樣不能互相操作彼此的Cookie。

注意:用戶登錄網(wǎng)站www.google.com之后會(huì)發(fā)現(xiàn)訪問(wèn)images.google.com時(shí)登錄信息仍然有效违寿,而普通的Cookie是做不到的湃交。這是因?yàn)镚oogle做了特殊處理。本章后面也會(huì)對(duì)Cookie做類似的處理藤巢。

Unicode編碼:保存中文

中文與英文字符不同搞莺,中文屬于Unicode字符,在內(nèi)存中占4個(gè)字符掂咒,而英文屬于ASCII字符才沧,內(nèi)存中只占2個(gè)字節(jié)。Cookie中使用Unicode字符時(shí)需要對(duì)Unicode字符進(jìn)行編碼绍刮,否則會(huì)亂碼温圆。

提示:Cookie中保存中文只能編碼。一般使用UTF-8編碼即可孩革。不推薦使用GBK等中文編碼岁歉,因?yàn)闉g覽器不一定支持,而且JavaScript也不支持GBK編碼膝蜈。

BASE64編碼:保存二進(jìn)制圖片

Cookie不僅可以使用ASCII字符與Unicode字符锅移,還可以使用二進(jìn)制數(shù)據(jù)。例如在Cookie中使用數(shù)字證書饱搏,提供安全度非剃。使用二進(jìn)制數(shù)據(jù)時(shí)也需要進(jìn)行編碼。

注意:本程序僅用于展示Cookie中可以存儲(chǔ)二進(jìn)制內(nèi)容推沸,并不實(shí)用备绽。由于瀏覽器每次請(qǐng)求服務(wù)器都會(huì)攜帶Cookie,因此Cookie內(nèi)容不宜過(guò)多鬓催,否則影響速度肺素。Cookie的內(nèi)容應(yīng)該少而精。

設(shè)置Cookie的所有屬性

除了name與value之外宇驾,Cookie還具有其他幾個(gè)常用的屬性压怠。每個(gè)屬性對(duì)應(yīng)一個(gè)getter方法與一個(gè)setter方法。Cookie類的所有屬性如下所示飞苇。

String name:該Cookie的名稱菌瘫。Cookie一旦創(chuàng)建蜗顽,名稱便不可更改。 Object value:該Cookie的值雨让。如果值為Unicode字符雇盖,需要為字符編碼。如果值為二進(jìn)制數(shù)據(jù)栖忠,則需要使用BASE64編碼崔挖。 int maxAge:該Cookie失效的時(shí)間,單位秒庵寞。如果為正數(shù)狸相,則該Cookie在>maxAge秒之后失效。如果為負(fù)數(shù)捐川,該Cookie為臨時(shí)Cookie脓鹃,關(guān)閉瀏覽器即失效,瀏覽器也不會(huì)以任何形式保存該Cookie古沥。如果為0瘸右,表示刪除該Cookie。默認(rèn)為–1岩齿。 boolean secure:該Cookie是否僅被使用安全協(xié)議傳輸太颤。安全協(xié)議。安全協(xié)議有HTTPS盹沈,SSL等龄章,在網(wǎng)絡(luò)>上傳輸數(shù)據(jù)之前先將數(shù)據(jù)加密。默認(rèn)為false乞封。 String path:該Cookie的使用路徑瓦堵。如果設(shè)置為“/sessionWeb/”,則只有contextPath為“/sessionWeb”的程序可以訪問(wèn)該Cookie歌亲。如果設(shè)置為“/”,則本域名下contextPath都可以訪問(wèn)該Cookie澜驮。注意最后一個(gè)字符必須為“/”陷揪。 >String domain:可以訪問(wèn)該Cookie的域名。如果設(shè)置為“.google.com”杂穷,則所有以“google.com”結(jié)尾的域名都可以訪問(wèn)該Cookie悍缠。注意第一個(gè)字符必須為“.”。 String comment:該Cookie的用處說(shuō)明耐量。瀏覽器顯示Cookie信息的時(shí)候顯示該說(shuō)明飞蚓。 int version:該Cookie使>用的版本號(hào)。0表示遵循Netscape的Cookie規(guī)范廊蜒,1表示遵循W3C的RFC 2109規(guī)范趴拧。

Cookie的有效期

Cookie的maxAge決定著Cookie的有效期溅漾,單位為秒(Second)。Cookie中通過(guò)getMaxAge()方法與setMaxAge(int maxAge)方法來(lái)讀寫maxAge屬性著榴。 如果maxAge屬性為正數(shù)添履,則表示該Cookie會(huì)在maxAge秒之后自動(dòng)失效。瀏覽器會(huì)將maxAge為正數(shù)的Cookie持久化脑又,即寫到對(duì)應(yīng)的Cookie文件中暮胧。無(wú)論客戶關(guān)閉了瀏覽器還是電腦,只要還在maxAge秒之前问麸,登錄網(wǎng)站時(shí)該Cookie仍然有效往衷。下面代碼中的Cookie信息將永遠(yuǎn)有效。

Cookie cookie = new?Cookie("username","helloweenvsfei"); // 新建Cookie

cookie.setMaxAge(Integer.MAX_VALUE); // 設(shè)置生命周期為MAX_VALUE

response.addCookie(cookie); // 輸出到客戶端

如果maxAge為負(fù)數(shù)严卖,則表示該Cookie僅在本瀏覽器窗口以及本窗口打開的子窗口內(nèi)有效席舍,關(guān)閉窗口后該Cookie即失效。maxAge為負(fù)數(shù)的Cookie妄田,為臨時(shí)性Cookie俺亮,不會(huì)被持久化,不會(huì)被寫到Cookie文件中疟呐。Cookie信息保存在瀏覽器內(nèi)存中脚曾,因此關(guān)閉瀏覽器該Cookie就消失了。Cookie默認(rèn)的maxAge值為–1启具。

如果maxAge為0本讥,則表示刪除該Cookie。Cookie機(jī)制沒(méi)有提供刪除Cookie的方法鲁冯,因此通過(guò)設(shè)置該Cookie即時(shí)失效實(shí)現(xiàn)刪除Cookie的效果拷沸。失效的Cookie會(huì)被瀏覽器從Cookie文件或者內(nèi)存中刪除:

Cookie cookie = new?Cookie("username","helloweenvsfei"); // 新建Cookie

cookie.setMaxAge(0); // 設(shè)置生命周期為0,不能為負(fù)數(shù)

response.addCookie(cookie); // 必須執(zhí)行這一句

response對(duì)象提供的Cookie操作方法只有一個(gè)添加操作add(Cookie cookie)薯演。要想修改Cookie只能使用一個(gè)同名的Cookie來(lái)覆蓋原來(lái)的Cookie撞芍,達(dá)到修改的目的。刪除時(shí)只需要把maxAge修改為0即可跨扮。

注意:從客戶端讀取Cookie時(shí)序无,包括maxAge在內(nèi)的其他屬性都是不可讀的,也不會(huì)被提交衡创。瀏覽器提交Cookie時(shí)只會(huì)提交name與value屬性帝嗡。maxAge屬性只被瀏覽器用來(lái)判斷Cookie是否過(guò)期。

Cookie的修改璃氢、刪除

Cookie并不提供修改哟玷、刪除操作。如果要修改某個(gè)Cookie一也,只需要新建一個(gè)同名的Cookie巢寡,添加到response中覆蓋原來(lái)的Cookie喉脖。如果要?jiǎng)h除某個(gè)Cookie,只需要新建一個(gè)同名的Cookie讼渊,并將maxAge設(shè)置為0动看,并添加到response中覆蓋原來(lái)的Cookie。注意是0而不是負(fù)數(shù)爪幻。負(fù)數(shù)代表其他的意義菱皆。讀者可以通過(guò)上例的程序進(jìn)行驗(yàn)證,設(shè)置不同的屬性挨稿。

注意:修改仇轻、刪除Cookie時(shí),新建的Cookie除value奶甘、maxAge之外的所有屬性篷店,例如name、path臭家、domain等疲陕,都要與原Cookie完全一樣。否則钉赁,瀏覽器將視為兩個(gè)不同的Cookie不予覆蓋蹄殃,導(dǎo)致修改、刪除失敗你踩。

Cookie的域名

Cookie是不可跨域名的诅岩。域名www.google.com頒發(fā)的Cookie不會(huì)被提交到域名www.baidu.com去。這是由Cookie的隱私安全機(jī)制決定的带膜。隱私安全機(jī)制能夠禁止網(wǎng)站非法獲取其他網(wǎng)站的Cookie吩谦。

正常情況下,同一個(gè)一級(jí)域名下的兩個(gè)二級(jí)域名如www.helloweenvsfei.com和images.helloweenvsfei.com也不能交互使用Cookie膝藕,因?yàn)槎叩挠蛎⒉粐?yán)格相同式廷。如果想所有helloweenvsfei.com名下的二級(jí)域名都可以使用該Cookie,需要設(shè)置Cookie的domain參數(shù)滑废,例如:

Cookie cookie = new?Cookie("time","20080808"); // 新建Cookie

cookie.setDomain(".helloweenvsfei.com"); // 設(shè)置域名

cookie.setPath("/"); // 設(shè)置路徑

cookie.setMaxAge(Integer.MAX_VALUE); // 設(shè)置有效期

response.addCookie(cookie); // 輸出到客戶端

讀者可以修改本機(jī)C:\WINDOWS\system32\drivers\etc下的hosts文件來(lái)配置多個(gè)臨時(shí)域名穗慕,然后使用setCookie.jsp程序來(lái)設(shè)置跨域名Cookie驗(yàn)證domain屬性怀各。

注意:domain參數(shù)必須以點(diǎn)(".")開始。另外醇疼,name相同但domain不同的兩個(gè)Cookie是兩個(gè)不同的Cookie。如果想要兩個(gè)域名完全不同的網(wǎng)站共有Cookie乙濒,可以生成兩個(gè)Cookie,domain屬性分別為兩個(gè)域名,輸出到客戶端。

Cookie的路徑

domain屬性決定運(yùn)行訪問(wèn)Cookie的域名幌氮,而path屬性決定允許訪問(wèn)Cookie的路徑(ContextPath)韭畸。例如随橘,如果只允許/sessionWeb/下的程序使用Cookie,可以這么寫:

Cookie cookie = new?Cookie("time","20080808"); // 新建Cookie

cookie.setPath("/session/"); // 設(shè)置路徑

response.addCookie(cookie); // 輸出到客戶端

設(shè)置為“/”時(shí)允許所有路徑使用Cookie梆掸。path屬性需要使用符號(hào)“/”結(jié)尾。name相同但domain不同的兩個(gè)Cookie也是兩個(gè)不同的Cookie。

注意:頁(yè)面只能獲取它屬于的Path的Cookie拔恰。例如/session/test/a.jsp不能獲取到路徑為/session/abc/的Cookie。使用時(shí)一定要注意河爹。

domain表示的是cookie所在的域魔眨,默認(rèn)為請(qǐng)求的地址侄刽,如網(wǎng)址為www.test.com/test/test.aspx杂彭,那么domain默認(rèn)為www.test.com所计。而跨域訪問(wèn)钾腺,如域A為t1.test.com,域B為t2.test.com,那么在域A生產(chǎn)一個(gè)令域A和域B都能訪問(wèn)的cookie就要將該cookie的domain設(shè)置為.test.com治拿;如果要在域A生產(chǎn)一個(gè)令域A不能訪問(wèn)而域B能訪問(wèn)的cookie就要將該cookie的domain設(shè)置為t2.test.com。

path表示cookie所在的目錄笆焰,默認(rèn)為/劫谅,就是根目錄。在同一個(gè)服務(wù)器上有目錄如下:/test/,/test/cd/,/test/dd/嚷掠,現(xiàn)設(shè)一個(gè)cookie1的path為/test/捏检,cookie2的path為/test/cd/,那么test下的所有頁(yè)面都可以訪問(wèn)到cookie1不皆,而/test/和/test/dd/的子頁(yè)面不能訪問(wèn)cookie2贯城。這是因?yàn)閏ookie能讓其path路徑下的頁(yè)面訪問(wèn)。

瀏覽器會(huì)將domain和path都相同的cookie保存在一個(gè)文件里霹娄,cookie間用*隔開能犯。

Cookie的安全屬性

HTTP協(xié)議不僅是無(wú)狀態(tài)的,而且是不安全的犬耻。使用HTTP協(xié)議的數(shù)據(jù)不經(jīng)過(guò)任何加密就直接在網(wǎng)絡(luò)上傳播踩晶,有被截獲的可能。使用HTTP協(xié)議傳輸很機(jī)密的內(nèi)容是一種隱患香追。如果不希望Cookie在HTTP等非安全協(xié)議中傳輸合瓢,可以設(shè)置Cookie的secure屬性為true。瀏覽器只會(huì)在HTTPS和SSL等安全協(xié)議中傳輸此類Cookie透典。下面的代碼設(shè)置secure屬性為true:

Cookie cookie = new?Cookie("time", "20080808"); // 新建Cookie

cookie.setSecure(true); // 設(shè)置安全屬性

response.addCookie(cookie); // 輸出到客戶端

提示:secure屬性并不能對(duì)Cookie內(nèi)容加密晴楔,因而不能保證絕對(duì)的安全性。如果需要高安全性峭咒,需要在程序中對(duì)Cookie內(nèi)容加密税弃、解密,以防泄密凑队。

JavaScript操作Cookie

Cookie是保存在瀏覽器端的则果,因此瀏覽器具有操作Cookie的先決條件幔翰。瀏覽器可以使用腳本程序如JavaScript或者VBScript等操作Cookie。這里以JavaScript為例介紹常用的Cookie操作西壮。例如下面的代碼會(huì)輸出本頁(yè)面所有的Cookie遗增。

document.write(document.cookie);

由于JavaScript能夠任意地讀寫Cookie,有些好事者便想使用JavaScript程序去窺探用戶在其他網(wǎng)站的Cookie款青。不過(guò)這是徒勞的做修,W3C組織早就意識(shí)到JavaScript對(duì)Cookie的讀寫所帶來(lái)的安全隱患并加以防備了,W3C標(biāo)準(zhǔn)的瀏覽器會(huì)阻止JavaScript讀寫任何不屬于自己網(wǎng)站的Cookie抡草。換句話說(shuō)饰及,A網(wǎng)站的JavaScript程序讀寫B(tài)網(wǎng)站的Cookie不會(huì)有任何結(jié)果。

轉(zhuǎn)載:?理解Cookie和Session機(jī)制

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末康震,一起剝皮案震驚了整個(gè)濱河市燎含,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腿短,老刑警劉巖屏箍,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異橘忱,居然都是意外死亡铣除,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門鹦付,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)尚粘,“玉大人,你說(shuō)我怎么就攤上這事敲长±杉蓿” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵祈噪,是天一觀的道長(zhǎng)泽铛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)辑鲤,這世上最難降的妖魔是什么盔腔? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮月褥,結(jié)果婚禮上弛随,老公的妹妹穿的比我還像新娘。我一直安慰自己宁赤,他們只是感情好舀透,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著决左,像睡著了一般愕够。 火紅的嫁衣襯著肌膚如雪走贪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天惑芭,我揣著相機(jī)與錄音坠狡,去河邊找鬼。 笑死遂跟,一個(gè)胖子當(dāng)著我的面吹牛擦秽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播漩勤,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缩搅!你這毒婦竟也來(lái)了越败?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤硼瓣,失蹤者是張志新(化名)和其女友劉穎究飞,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堂鲤,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亿傅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瘟栖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葵擎。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖半哟,靈堂內(nèi)的尸體忽然破棺而出酬滤,到底是詐尸還是另有隱情,我是刑警寧澤寓涨,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布盯串,位于F島的核電站,受9級(jí)特大地震影響戒良,放射性物質(zhì)發(fā)生泄漏体捏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一糯崎、第九天 我趴在偏房一處隱蔽的房頂上張望几缭。 院中可真熱鬧,春花似錦沃呢、人聲如沸奏司。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)韵洋。三九已至竿刁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搪缨,已是汗流浹背食拜。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留副编,地道東北人负甸。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像痹届,于是被迫代替她去往敵國(guó)和親呻待。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 會(huì)話(Session)跟蹤是Web程序中常用的技術(shù)队腐,用來(lái)跟蹤用戶的整個(gè)會(huì)話蚕捉。常用的會(huì)話跟蹤技術(shù)是Cookie與Se...
    chinariver閱讀 5,599評(píng)論 1 49
  • 目錄Cookie機(jī)制什么是CookieCookie的不可跨域名性Unicode編碼:保存中文BASE64編碼:保存...
    Tomatoro閱讀 16,925評(píng)論 7 186
  • 你來(lái)了迫淹,春就到了 當(dāng)?shù)谝豢|暖風(fēng) 吹著口哨,歡快的 銜開春天的門簾 你便踩著平仄的韻腳 輕輕的向我走來(lái) 你來(lái)了为严,花就...
    美文小屋閱讀 402評(píng)論 1 3
  • 微信大號(hào)怎么運(yùn)營(yíng)?怎么提升粉絲的活躍度?微信大號(hào)宣傳最吸粉的方法是什么呢? 第一敛熬,微信大號(hào)宣傳時(shí)可以選擇一些熱點(diǎn)新...
    360微課堂閱讀 1,315評(píng)論 0 0
  • 1.一個(gè)星期前打電話調(diào)了架構(gòu),上午從新打客服電話查了我的架構(gòu)第股!幫助親推2代訂產(chǎn)品下單!她說(shuō)她一直都買不了应民,我也找不...
    雪兒68閱讀 142評(píng)論 0 0