1. 程式人生 > >Cookie出現兩個同名Key的問題

Cookie出現兩個同名Key的問題

問題

  Http請求中出現了兩個同名Cookie,導致服務端獲取到的錯誤的資訊

原理

  Cookie不僅僅有名字和值兩個屬性,還有域(domain)、路徑(path)等屬性。其中,不同的域、不同的路徑下可以存在同樣名字的cookie。一般我們設定cookie的方法是用一個同樣名字、一個值。這時就一定要搞清楚你要設定的cookie的域和路徑,否則就會產生問題中的情況。

再次複習一下Cookie的屬性

屬性描述
nameCookie的名稱,Cookie一旦建立,名稱便不可更改
valueCookie的值。如果值為Unicode字元,需要為字元編碼。如果值為二進位制資料,則需要使用BASE64編碼
maxAgeCookie失效的時間,單位秒。如果為正數,則該Cookie在maxAge秒之後失效。如果為負數,該Cookie為臨時Cookie,關閉瀏覽器即失效,瀏覽器也不會以任何形式儲存該Cookie。如果為0,表示刪除該Cookie。預設為-1。
secure該Cookie是否僅被使用安全協議傳輸。安全協議。安全協議有HTTPS,SSL等,在網路上傳輸資料之前先將資料加密。預設為false。
pathCookie的使用路徑。如果設定為“/sessionWeb/”,則只有contextPath為“/sessionWeb”的程式可以訪問該Cookie。如果設定為“/”,則本域名下contextPath都可以訪問該Cookie。注意最後一個字元必須為“/”。
domain可以訪問該Cookie的域名。如果設定為“.google.com”,則所有以“google.com”結尾的域名都可以訪問該Cookie。注意第一個字元必須為“.”。
comment該Cookie的用處說明,瀏覽器顯示Cookie資訊的時候顯示該說明。
versionCookie使用的版本號。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是不可跨域名的。域名www.google.com頒發的Cookie不會被提交到域名www.baidu.com去。這是由Cookie的隱私安全機制決定的。隱私安全機制能夠禁止網站非法獲取其他網站的Cookie。

  正常情況下,同一個一級域名下的兩個二級域名如www.baidu.com和images.baidu.com也不能互動使用Cookie,因為二者的域名並不嚴格相同。如果想所有baidu.com名下的二級域名都可以使用該Cookie,需要設定Cookie的domain引數為.baidu.com

  讀者可以修改本機C:\WINDOWS\system32\drivers\etc下的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攻擊。

相關推薦

Cookie出現同名Key的問題

問題  Http請求中出現了兩個同名Cookie,導致服務端獲取到的錯誤的資訊原理  Cookie不僅僅有名字和值兩個屬性,還有域(domain)、路徑(path)等屬性。其中,不同的域、不同的路徑下可以存在同樣名字的cookie。一般我們設定cookie的方法是用一個同樣名

Windows10操作系統出現移動盤符解決方法

Windows10操作系統出現兩個移動盤按照下面的註冊鍵值,將{F5FB2C77-0E2F-4A16-A381-3E560C68BC83}鍵值前增加一個“-”即可。HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\

js通過cookie沒有關系的jsp頁面進行傳值

IT eva 有關 time bsp 關系 cape document 兩個   //Cookie取值   function readCookie (name)   {     var cookieValue = "";     v

同名controller導致調用崩潰

一次 tro 比較 調用 兩個 中斷 沒有 之前 正常的 之前遇到一個很詭異的bug,大概情況如下: 生成成功,運行正常,調試正常 但是調用目標controller的目標方法,運行自動中斷,調試自動中斷 沒有任何明確的錯誤提示,包括調試都沒有彈窗報錯 調用其他的contro

重啟vue出現bug,一個是element-ui樣式檔案不存在,另一個是vue-style-loader!css-loader?

These dependencies were not found: * element-ui/lib/theme-default/index.css in ./src/main.js * !!vue-style-loader!css-loader?{"sourceMap":true}

物件key相同但是value不同,將value不同的鍵值對以物件形式輸出

let obj={ name:'jack', age:18, sex:'girl' } let obj2={ name:'rose', age:18, sex:'boy' }

ubuntu工作列出現圖示

我在ubuntu上安裝了微信, 開啟微信後出現兩個微信圖示, 百度了一大堆, 下面是別人的解決方式, 但是並沒有解決我的問題: ubuntu14下,用unity的啟動器開啟google-chrome,在啟動器上會有兩個chrome的圖示, 而且點選其中一個會無視存在的chrome視窗,開啟新

iOS執行專案出現同名檔案衝突的編譯報錯

今天剛剛入職 從git上下載下來程式碼後,編譯程式出現一大溜的報錯 multiple commands produce xxx.txt (xxx代表一長串地址路徑)。 不要慌 解決方法一: 修改為不同型別的檔名或刪除這些檔案,但是這裡要注意在專案中要用到這些檔案的話,修改檔名要注意修改專案

Eclipse Web 專案所有的都出現紅點,解決方法

我是匯入tomcat包的時候出現問題 網上很多方法說:右鍵工程,選擇build path->configure build path,彈出的窗口裡面選擇libraries選項卡,你應該會看到一些標有紅叉叉的jar包 但是我這邊所有包都顯示正常,並沒有出現標記的錯誤包

springcloud專案啟動不了,出現bean

Description: Field userFeign in com.yimao.cloud.order.controller.OrderController required a single bean, but 2 were found: - feignBui

(親測解決)每次開啟excel檔案都會出現視窗,一個是空白的sheet1,另一個是自己的文件

轉載:https://blog.csdn.net/sinat_34104446/article/details/80210424 一、問題描述 每次開啟Excel(WPS、Office都會出現,當前版本是Office2016)檔案都會出現兩個視窗,一個是空白的sheet

robot framework定位出現iframe

正常使用select frame關鍵詞,後面寫上iframe的id即可,通常前面與unselect frame關鍵字配合使用。 當出現兩個iframe的id和name都一樣時,可以使用src元素的不變部分進行定位,方法如下: Unselect Frame   

opencv VirualStudio2015 namedWindow imgshow 方法會出現視窗問題

問題描述:筆者最近在看一些opencv的東西,但配置好之後執行書上的程式碼發現竟然會顯示兩個視窗,一個視窗顯示圖片,另外一個圖片卻是一個灰色的空白視窗,而且監聽事件只有空白視窗上有效。 筆者在百度上其他道友的部落格中發現了兩種解決方案,但都不是很理想。 方案一:將Micr

hadoop叢集出現datanode節點互相排斥的情況解決

我明明配置了3個節點的datanode,但是在 http://mini2:50070/dfshealth.html#tab-overview 的管理介面了只看到兩天存活 Live Nodes 為 2, Dead Nodes 為 0 我想就算有一臺掛掉也

Android studio匯入另外一個專案作為Library後出現啟動專案等各類問題

首先說正確的 匯入Library的方式: 1.啟動AndroidStudio後,開啟你需要接收Library的專案。比如有兩個專案,專案A,和Library專案B,那麼開啟專案A。 2.在下拉選單中依次找到New— —Import Module,點選開啟專案匯入視窗。注意匯

一個專案中不能同時出現main函式

 在寫兩個短程式的時候想著把兩個cpp檔案放到同一個專案中比較省空間,然後就出現了下面的問題:main函式已經定義過,然後將專案中的一個含有main函式的cpp檔案刪除之後再執行,可以執行 原因大概是main函式是程式的入口,一個專案中只能有一個 如果覺得建立多個主函式

每次開啟excel檔案都會出現視窗,一個是空白的sheet1,另一個是自己的文件

本地安裝完mysql之後,每次開啟excel檔案都會出現兩個視窗,一個是空白的sheet1。仔細回想了下,之前沒有這種問題,在網上找了篇文章,按照步驟操作之後居然真的解決了問題,特轉發以下。 https://blog.csdn.net/sinat_34104446/article/details

android studio 安裝出現圖示

       最近更換了android的開發工具,把自己之前使用了一段時間的eclipse換成了android studio,那就需要把自己的eclipse專案匯入到android studio中。在把一些錯誤排查完之後,我把android專案安裝到手機上的時候,發現我的a

關於Spring容器中定時器到時執行會出現執行緒同時執行的問題

最近公司有一個小需求,是需要定時去從某一個視訊供應商下載視訊檔案,問題很簡單,直接使用quartz,編寫相應的定時器程式碼,同時配置相應的定時器時間,但是在定時執行之後會出現兩個執行緒同時執行定時任務的問題,並且這兩個執行緒併發執行,從而一直影響到視訊檔案下載。

JavaWeb----Cookie應用

1.利用Cookie實現最近瀏覽的商品 books.jsp <%@ page language="java" contentType="text/html; charset=UTF-8"