Cookie中出現(xiàn)兩個同名key和value的cookie

如題:

出現(xiàn)兩個同名key和value的cookie

為啥?

轉(zhuǎn)載自:Cookie出現(xiàn)兩個同名Key的問題
Cookie不僅僅有名字和值兩個屬性,還有域(domain)、路徑(path)等屬性。其中,不同的域、不同的路徑下可以存在同樣名字的cookie。一般我們設(shè)置cookie的方法是用一個同樣名字、一個值。這時就一定要搞清楚你要設(shè)置的cookie的域和路徑,否則就會產(chǎn)生問題中的情況。

一頓復(fù)制粘貼,記錄下:

屬性 描述
name Cookie的名稱,Cookie一旦創(chuàng)建,名稱便不可更改
value Cookie的值。如果值為Unicode字符,需要為字符編碼。如果值為二進(jìn)制數(shù)據(jù),則需要使用BASE64編碼
maxAge Cookie失效的時間,單位秒。如果為正數(shù),則該Cookie在maxAge秒之后失效。如果為負(fù)數(shù),該Cookie為臨時Cookie,關(guān)閉瀏覽器即失效,瀏覽器也不會以任何形式保存該Cookie。如果為0,表示刪除該Cookie。默認(rèn)為-1。
secure 該Cookie是否僅被使用安全協(xié)議傳輸。安全協(xié)議。安全協(xié)議有HTTPS,SSL等,在網(wǎng)絡(luò)上傳輸數(shù)據(jù)之前先將數(shù)據(jù)加密。默認(rèn)為false。
path Cookie的使用路徑。如果設(shè)置為“/sessionWeb/”,則只有contextPath為“/sessionWeb”的程序可以訪問該Cookie。如果設(shè)置為“/”,則本域名下contextPath都可以訪問該Cookie。注意最后一個字符必須為“/”。
domain 可以訪問該Cookie的域名。如果設(shè)置為“.google.com”,則所有以“google.com”結(jié)尾的域名都可以訪問該Cookie。注意第一個字符必須為“.”。
comment 該Cookie的用處說明,瀏覽器顯示Cookie信息的時候顯示該說明。
version Cookie使用的版本號。0表示遵循Netscape的Cookie規(guī)范,1表示遵循W3C的RFC 2109規(guī)范

Cookie的有效期

Cookie的maxAge決定著Cookie的有效期,單位為秒(Second)。Cookie中通過getMaxAge()方法與setMaxAge(int maxAge)方法來讀寫maxAge屬性。
  如果maxAge屬性為正數(shù),則表示該Cookie會在maxAge秒之后自動失效。瀏覽器會將maxAge為正數(shù)的Cookie持久化,即寫到對應(yīng)的Cookie文件中。無論客戶關(guān)閉了瀏覽器還是電腦,只要還在maxAge秒之前,登錄網(wǎng)站時該Cookie仍然有效。下面代碼中的Cookie信息將永遠(yuǎn)有效。
  如果maxAge為負(fù)數(shù),則表示該Cookie僅在本瀏覽器窗口以及本窗口打開的子窗口內(nèi)有效,關(guān)閉窗口后該Cookie即失效。maxAge為負(fù)數(shù)的Cookie,為臨時性Cookie,不會被持久化,不會被寫到Cookie文件中。Cookie信息保存在瀏覽器內(nèi)存中,因此關(guān)閉瀏覽器該Cookie就消失了。Cookie默認(rèn)的maxAge值為-1。
  如果maxAge為0,則表示刪除該Cookie。Cookie機制沒有提供刪除Cookie的方法,因此通過設(shè)置該Cookie即時失效實現(xiàn)刪除Cookie的效果。失效的Cookie會被瀏覽器從Cookie文件或者內(nèi)存中刪除,
  response對象提供的Cookie操作方法只有一個添加操作add(Cookie cookie)。
要想修改Cookie只能使用一個同名的Cookie來覆蓋原來的Cookie,達(dá)到修改的目的。刪除時只需要把maxAge修改為0即可。
  從客戶端讀取Cookie時,包括maxAge在內(nèi)的其他屬性都是不可讀的,也不會被提交。瀏覽器提交Cookie時只會提交name與value屬性。maxAge屬性只被瀏覽器用來判斷Cookie是否過期。

Cookie的修改、刪除

Cookie并不提供修改、刪除操作。如果要修改某個Cookie,只需要新建一個同名的Cookie,添加到response中覆蓋原來的Cookie。
  如果要刪除某個Cookie,只需要新建一個同名的Cookie,并將maxAge設(shè)置為0,并添加到response中覆蓋原來的Cookie。
  注意:修改、刪除Cookie時,新建的Cookie除value、maxAge之外的所有屬性,例如name、path、domain等,都要與原Cookie完全一樣。否則,瀏覽器將視為兩個不同的Cookie不予覆蓋,導(dǎo)致修改、刪除失敗。

Cookie的域名

Cookie是不可跨域名的。域名www.google.com頒發(fā)的Cookie不會被提交到域名www.baidu.com去。這是由Cookie的隱私安全機制決定的。隱私安全機制能夠禁止網(wǎng)站非法獲取其他網(wǎng)站的Cookie。
  正常情況下,同一個一級域名下的兩個二級域名如www.baidu.comimages.baidu.com也不能交互使用Cookie,因為二者的域名并不嚴(yán)格相同。如果想所有baidu.com名下的二級域名都可以使用該Cookie,需要設(shè)置Cookie的domain參數(shù)為.baidu.com
  讀者可以修改本機C:\WINDOWS\system32\drivers\etc下的hosts文件來配置多個臨時域名來驗證domain屬性。
  注意:domain參數(shù)必須以點(".")開始。另外,name相同但domain不同的兩個Cookie是兩個不同的Cookie。如果想要兩個域名完全不同的網(wǎng)站共有Cookie,可以生成兩個Cookie,domain屬性分別為兩個域名,輸出到客戶端。

Cookie的路徑

domain屬性決定運行訪問Cookie的域名,而path屬性決定允許訪問Cookie的路徑(ContextPath)。例如,如果只允許/sessionWeb/下的程序使用Cookie,可以這么寫cookie.setPath("/session/")。
  設(shè)置為“/”時允許所有路徑使用Cookie。path屬性需要使用符號“/”結(jié)尾。name相同但domain相同的兩個Cookie也是兩個不同的Cookie。
  頁面只能獲取它屬于的Path的Cookie。例如/session/test/a.jsp不能獲取到路徑為/session/abc/的Cookie。

Cookie的安全屬性

HTTP協(xié)議不僅是無狀態(tài)的,而且是不安全的。使用HTTP協(xié)議的數(shù)據(jù)不經(jīng)過任何加密就直接在網(wǎng)絡(luò)上傳播,有被截獲的可能。使用HTTP協(xié)議傳輸很機密的內(nèi)容是一種隱患。如果不希望Cookie在HTTP等非安全協(xié)議中傳輸,可以設(shè)置Cookie的secure屬性為true。瀏覽器只會在HTTPS和SSL等安全協(xié)議中傳輸此類Cookie。設(shè)置secure屬性為true的代碼是cookie.setSecure(true);
  secure屬性并不能對Cookie內(nèi)容加密,因而不能保證絕對的安全性。如果需要高安全性,需要在程序中對Cookie內(nèi)容加密、解密,以防泄密。

JavaScript操作Cookie

Cookie是保存在瀏覽器端的,因此瀏覽器具有操作Cookie的先決條件。瀏覽器可以使用腳本程序如JavaScript或者VBScript等操作Cookie。這里以JavaScript為例介紹常用的Cookie操作。例如下面的代碼會輸出本頁面所有的Cookie。

  <script>document.write(document.cookie);</script>

由于JavaScript能夠任意地讀寫Cookie,給網(wǎng)站帶來安全隱患,W3C標(biāo)準(zhǔn)的瀏覽器會阻止JavaScript讀寫任何不屬于自己網(wǎng)站的Cookie。換句話說,A網(wǎng)站的JavaScript程序讀寫B(tài)網(wǎng)站的Cookie不會有任何結(jié)果。
  部分瀏覽器支持設(shè)置HttpOnly屬性,如果在cookie中設(shè)置了HttpOnly屬性,那么通過js腳本將無法讀取到cookie信息,這樣能有效的防止XSS攻擊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容