Cookie出現兩個同名Key的問題
問題
Http請求中出現了兩個同名Cookie,導致服務端獲取到的錯誤的資訊
原理
Cookie不僅僅有名字和值兩個屬性,還有域(domain)、路徑(path)等屬性。其中,不同的域、不同的路徑下可以存在同樣名字的cookie。一般我們設定cookie的方法是用一個同樣名字、一個值。這時就一定要搞清楚你要設定的cookie的域和路徑,否則就會產生問題中的情況。
再次複習一下Cookie的屬性
屬性 | 描述 |
name | Cookie的名稱,Cookie一旦建立,名稱便不可更改 |
value | Cookie的值。如果值為Unicode字元,需要為字元編碼。如果值為二進位制資料,則需要使用BASE64編碼 |
maxAge | Cookie失效的時間,單位秒。如果為正數,則該Cookie在maxAge秒之後失效。如果為負數,該Cookie為臨時Cookie,關閉瀏覽器即失效,瀏覽器也不會以任何形式儲存該Cookie。如果為0,表示刪除該Cookie。預設為-1。 |
secure | 該Cookie是否僅被使用安全協議傳輸。安全協議。安全協議有HTTPS,SSL等,在網路上傳輸資料之前先將資料加密。預設為false。 |
path | Cookie的使用路徑。如果設定為“/sessionWeb/”,則只有contextPath為“/sessionWeb”的程式可以訪問該Cookie。如果設定為“/”,則本域名下contextPath都可以訪問該Cookie。注意最後一個字元必須為“/”。 |
domain | 可以訪問該Cookie的域名。如果設定為“.google.com”,則所有以“google.com”結尾的域名都可以訪問該Cookie。注意第一個字元必須為“.”。 |
comment | 該Cookie的用處說明,瀏覽器顯示Cookie資訊的時候顯示該說明。 |
version | Cookie使用的版本號。0表示遵循Netscape的Cookie規範,1表示遵循W3C的RFC 2109規範 |
Cookie的有效期
Cookie的maxAge決定著Cookie的有效期,單位為秒(Second)。Cookie中透過getMaxAge()方法與setMaxAge(int maxAge)方法來讀寫maxAge屬性。
如果maxAge屬性為正數,則表示該Cookie會在maxAge秒之後自動失效。瀏覽器會將maxAge為正數的Cookie持久化,即寫到對應的Cookie檔案中。無論客戶關閉了瀏覽器還是電腦,只要還在maxAge秒之前,登入網站時該Cookie仍然有效。下面程式碼中的Cookie資訊將永遠有效。
如果maxAge為負數,則表示該Cookie僅在本瀏覽器視窗以及本視窗開啟的子視窗內有效,關閉視窗後該Cookie即失效。maxAge為負數的Cookie,為臨時性Cookie,不會被持久化,不會被寫到Cookie檔案中。Cookie資訊儲存在瀏覽器記憶體中,因此關閉瀏覽器該Cookie就消失了。Cookie預設的maxAge值為-1。
如果maxAge為0,則表示刪除該Cookie。Cookie機制沒有提供刪除Cookie的方法,因此透過設定該Cookie即時失效實現刪除Cookie的效果。失效的Cookie會被瀏覽器從Cookie檔案或者記憶體中刪除,
response物件提供的Cookie操作方法只有一個新增操作add(Cookie cookie)。
要想修改Cookie只能使用一個同名的Cookie來覆蓋原來的Cookie,達到修改的目的。刪除時只需要把maxAge修改為0即可。
從客戶端讀取Cookie時,包括maxAge在內的其他屬性都是不可讀的,也不會被提交。瀏覽器提交Cookie時只會提交name與value屬性。maxAge屬性只被瀏覽器用來判斷Cookie是否過期。
Cookie的修改、刪除
Cookie並不提供修改、刪除操作。如果要修改某個Cookie,只需要新建一個同名的Cookie,新增到response中覆蓋原來的Cookie。
如果要刪除某個Cookie,只需要新建一個同名的Cookie,並將maxAge設定為0,並新增到response中覆蓋原來的Cookie。
注意:修改、刪除Cookie時,新建的Cookie除value、maxAge之外的所有屬性,例如name、path、domain等,都要與原Cookie完全一樣。否則,瀏覽器將視為兩個不同的Cookie不予覆蓋,導致修改、刪除失敗。
Cookie的域名
Cookie是不可跨域名的。域名頒發的Cookie不會被提交到域名去。這是由Cookie的隱私安全機制決定的。隱私安全機制能夠禁止網站非法獲取其他網站的Cookie。
正常情況下,同一個一級域名下的兩個二級域名如和images.baidu.com也不能互動使用Cookie,因為二者的域名並不嚴格相同。如果想所有baidu.com名下的二級域名都可以使用該Cookie,需要設定Cookie的domain引數為.baidu.com
讀者可以修改本機C:WINDOWSsystem32driversetc下的hosts檔案來配置多個臨時域名來驗證domain屬性。
注意:domain引數必須以點(".")開始。另外,name相同但domain不同的兩個Cookie是兩個不同的Cookie。如果想要兩個域名完全不同的網站共有Cookie,可以生成兩個Cookie,domain屬性分別為兩個域名,輸出到客戶端。
Cookie的路徑
domain屬性決定執行訪問Cookie的域名,而path屬性決定允許訪問Cookie的路徑(ContextPath)。例如,如果只允許/sessionWeb/下的程式使用Cookie,可以這麼寫cookie.setPath("/session/")。
設定為“/”時允許所有路徑使用Cookie。path屬性需要使用符號“/”結尾。name相同但domain相同的兩個Cookie也是兩個不同的Cookie。
頁面只能獲取它屬於的Path的Cookie。例如/session/test/a.jsp不能獲取到路徑為/session/abc/的Cookie。
Cookie的安全屬性
HTTP協議不僅是無狀態的,而且是不安全的。使用HTTP協議的資料不經過任何加密就直接在網路上傳播,有被截獲的可能。使用HTTP協議傳輸很機密的內容是一種隱患。如果不希望Cookie在HTTP等非安全協議中傳輸,可以設定Cookie的secure屬性為true。瀏覽器只會在HTTPS和SSL等安全協議中傳輸此類Cookie。設定secure屬性為true的程式碼是cookie.setSecure(true);
secure屬性並不能對Cookie內容加密,因而不能保證絕對的安全性。如果需要高安全性,需要在程式中對Cookie內容加密、解密,以防洩密。
JavaScript操作Cookie
Cookie是儲存在瀏覽器端的,因此瀏覽器具有操作Cookie的先決條件。瀏覽器可以使用指令碼程式如JavaScript或者VBScript等操作Cookie。這裡以JavaScript為例介紹常用的Cookie操作。例如下面的程式碼會輸出本頁面所有的Cookie。
<script>document.write(document.cookie);</script>
由於JavaScript能夠任意地讀寫Cookie,給網站帶來安全隱患,W3C標準的瀏覽器會阻止JavaScript讀寫任何不屬於自己網站的Cookie。換句話說,A網站的JavaScript程式讀寫B網站的Cookie不會有任何結果。
部分瀏覽器支援設定HttpOnly屬性,如果在cookie中設定了HttpOnly屬性,那麼透過js指令碼將無法讀取到cookie資訊,這樣能有效的防止XSS攻擊。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2331/viewspace-2815558/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- group by 使用的 as 同名問題!
- 兩個小問題深入淺出List的效能問題
- 關於git的ssh-key:解決本地多個ssh-key的問題Git
- 遇到一個建表時出現的問題
- gulimall出現的問題
- WKWebView的Cookie問題小記WebViewCookie
- 通過幾個問題深入分析Vue中的keyVue
- 學java就兩個問題Java
- 再來兩個小問題
- 使用finalshell出現的問題
- 兩個看似奇怪的MySQL語句問題MySql
- 關於dcat-admin的兩個問題...
- 兩個相同路徑、不同包、相同名稱類載入
- 使用imp/exp遇到兩個問題
- ubuntu20 crontab出現了一個問題Ubuntu
- redis中大key問題的解決思路Redis
- 號稱最安全的特斯拉ModelS,卻因一個安全帶在測試中兩次出現問題
- Java操作hdfs出現的問題Java
- npm install 時出現的問題NPM
- nginx 編譯出現的問題Nginx編譯
- mysql 安裝出現的問題MySql
- 兩個考研政治很多人問題但是解釋通的問題
- 工程專案成本管理容易出現的四個問題
- 記錄後臺遇到的兩個小問題
- ssh連線遠端伺服器出現Host key verification failed. lost connection問題的解決伺服器AI
- 處理多個會話時的 Cookie 和 Headers 複用問題會話CookieHeader
- 處理多個會話時的 Cookie 和 Headers複用問題會話CookieHeader
- 我遇過的最難的Cookie問題Cookie
- 我遇過的最難的 Cookie 問題Cookie
- 禁用 COOKIE 後如何訪問 SESSION 問題CookieSession
- 求助!關於npm install 老是出現這個問題NPM
- 專案出現的問題記錄
- springboot對接mqtt出現的問題Spring BootMQQT
- dubbo繼承springboot出現的問題繼承Spring Boot
- WPF --- 觸控式螢幕下的兩個問題
- 兩個流程鏈路問題的排查和總結
- JavaScript ES6 Fetch API時需要注意的一個Cookie問題JavaScriptAPICookie
- Cookie 詳解以及實現一個 cookie 操作庫Cookie