天天看點

好好了解一下cookie

由于http協定是無狀态的,而伺服器端的業務必須是要有狀态的。cookie誕生的最初目的是為了存儲web中的狀态資訊,以友善伺服器端使用。比如判斷使用者是否是第一次通路網站。目前最新的規範是rfc 6265,它是一個由浏覽器伺服器共同協作實作的規範。

cookie的處理分為:

伺服器像用戶端發送cookie

浏覽器将cookie儲存

之後每次http請求浏覽器都會将cookie發送給伺服器端

伺服器端像用戶端發送cookie是通過http響應封包實作的,在<code>set-cookie</code>中設定需要像用戶端發送的cookie,cookie格式如下:

其中<code>name=value</code>是必選項,其它都是可選項。cookie的主要構成如下:

name:一個唯一确定的cookie名稱。通常來講cookie的名稱是不區分大小寫的。

value:存儲在cookie中的字元串值。<code>最好為cookie的name和value進行url編碼</code>

domain:cookie對于哪個域是有效的。所有向該域發送的請求中都會包含這個cookie資訊。這個值可以包含子域(如:yq.aliyun.com),也可以不包含它(如:.aliyun.com,則對于aliyun.com的所有子域都有效).

path: 表示這個cookie影響到的路徑,浏覽器跟會根據這項配置,像指定域中比對的路徑發送cookie。

expires:失效時間,表示cookie何時應該被删除的時間戳(也就是,何時應該停止向伺服器發送這個cookie)。如果不設定這個時間戳,浏覽器會在頁面關閉時即将删除所有cookie;不過也可以自己設定删除時間。這個值是gmt時間格式,<code>如果用戶端和伺服器端時間不一緻,使用expires就會存在偏差</code>。

max-age: 與expires作用相同,用來告訴浏覽器此cookie多久過期(機關是秒),而不是一個固定的時間點。正常情況下,max-age的優先級高于expires。

httponly: 告知浏覽器不允許通過腳本<code>document.cookie</code>去更改這個值,同樣這個值在document.cookie中也不可見。但在http請求張仍然會攜帶這個cookie。注意這個值雖然在腳本中不可擷取,但仍然在浏覽器安裝目錄中以檔案形式存在。這項設定通常在伺服器端設定。

secure: 安全标志,指定後,隻有在使用ssl連結時候才能發送到伺服器,如果是http連結則不會傳遞該資訊。<code>就算設定了secure 屬性也并不代表他人不能看到你機器本地儲存的 cookie 資訊,是以不要把重要資訊放cookie就對了</code>

伺服器端設定cookie示例如下:

好好了解一下cookie
好好了解一下cookie

直接設定<code>set-cookie</code>過于原始,我們可以對cookie的設定過程做如下封裝:

需要注意的是,<code>如果給cookie設定一個過去的時間,浏覽器會立即删除該cookie</code>;此外domain項必須有兩個點,是以不能設定為<code>localhost</code>:

something that wasn't made clear to me here and totally confused me for a while was that domain names must contain at least two dots (.),hence 'localhost' is invalid and the browser will refuse to set the cookie!

cookie可以設定不同的域與路徑,是以對于同一個<code>name value</code>,在不同域不同路徑下是可以重複的,浏覽器會按照與目前請求url或頁面位址最佳比對的順序來排定先後順序

好好了解一下cookie

是以目前端傳遞到伺服器端的cookie有多個重複<code>name value</code>時,我們隻需要最比對的那個,也就是第一個。伺服器端解析代碼如下:

浏覽器将背景傳遞過來的cookie進行管理,并且允許開發者在javascript中使用<code>document.cookie</code>來存取cookie。但是這個接口使用起來非常蹩腳。<code>它會因為使用它的方式不同而表現出不同的行為</code>。

當用來擷取屬性值時,document.cookie傳回目前頁面可用的(根據cookie的域、路徑、失效時間和安全設定)所有的字元串,字元串的格式如下:

當用來設定值的時候,document.cookie屬性可設定為一個新的cookie字元串。這個字元串會被解釋并添加到現有的cookie集合中。如:

設定document.cookie并不會覆寫cookie,除非設定的<code>name value domain path</code>都與一個已存在cookie重複。

由于cookie的讀寫非常不友善,我們可以自己封裝一些函數來處理cookie,主要是針對cookie的添加、修改、删除。

繼續閱讀