Cookie總是儲存在用戶端中,按在用戶端中的存儲位置,可分為記憶體Cookie和硬碟Cookie。記憶體Cookie由浏覽器維護,儲存在記憶體中,浏覽器關閉後就消失了,其存在時間是短暫的。硬碟Cookie儲存在硬碟裡,有一個過期時間,除非使用者手工清理或到了過期時間,硬碟Cookie不會被删除,其存在時間是長期的。是以,按存在時間,可分為非持久Cookie和持久Cookie。
主要因為HTTP協定無狀态性,伺服器需要知道使用者在之前的頁面做了哪些操作,所欲引入Cookie,是一種解決HTTP協定無狀态的一種方式。
伺服器可以設定或讀取Cookies中包含的資訊,用來維護使用者和伺服器會話中的狀态。
電子商務購物網站,需要在使用者點選支付之前,知道使用者購買了哪些商品。 說明:目前也有不部門實作是,每次點選購買,都直接發請求到背景,背景存儲要購買的資料,然後再點選支付之前,從背景擷取使用者要購買的尚品資料,不使用Cookie也可以完成。
使用者登入,記住密碼。開發者可以在使用者登入之後,将使用者名和密碼,以某種加密的方式存儲到用戶端,第二次登入時,直接擷取Cookie,然後發送Cookie到背景伺服器進行驗證,達到使用者勾選了“記住密碼”,後續無需輸入使用者名和密碼的功能。當然是在Cookie的有效期内。
基于jQuery的jQuery.cookie.js是很多開發者用于項目中操作Cookie的庫。
Angular中為了使用者友善和簡潔的操作Cookie,提供了ngCookies子產品。這個子產品下面提供2種服務,分别是:
$cookieStore服務
$cookies服務

$cookies類似jQuery.cookie.js,提供了Angular操作Cookie的方法,普通情況下,JavaScript是不同向Cookie寫入對象的,但是Angular提供向Cookie寫入對象的方法。 $cookies提供一下方法:
<code>get(key)</code> 傳回一個指定key的cookie值
<code>getObject(key)</code> 傳回一個指定key的反序列化cookie值
<code>getAll()</code> 以key-value對象形式傳回所有的cookie
<code>put(key,value,[options])</code> 寫入一個key-value的cookie
<code>putObject(key,value,[options])</code>序列化設定一個key-value的Cookie
<code>remove(key,[options])</code> 移除對應key的cookie
demo如下:
比如設定cookie的寫入目錄,或者過期時間。我們可以用到的$cookiesProvider裡面的default配置資訊。
https://docs.angularjs.org/api/ngCookies/provider/$cookiesProvider#defaults 頁面可以檢視$cookieProvider裡面可以配置的資訊。比如使用者登入,記住密碼的cookie有效期是7天。代碼如下:
<code>encryptionStr()</code> 是自定義的加密字元串方法。
$cookieStore 服務是基于後端的Session Cookies,是以不能寫入的時候不能使用<code>options</code>屬性,而且它的過期時間就是session。關閉浏覽器了,cookie就失效了。在開發過程中,遇到一位同僚,要完成 使用者登入記住使用者名和密碼功能,使用的是如下代碼,代碼是無效的,因為$cookieStore不可以通過設定default裡面的expires設定過期時間,$cookieStore操作Cookie都是基于Session過期的。
寫這篇部落格的時候,Angular官網已經提示,$cookieStore已經過時,推薦使用$cookies服務。
ngCookies子產品提供的$cookies服務,為開發者操作讀取和寫入Cookie提供了極大的便利性,而且還支援寫入和讀取JSON對象。當時在開發過程中,我們還是不能過多向Cookie中寫入資料,一方面Cookie的大小有限制,另外一方面敏感的資料寫入Cookie,帶來安全性上的風險。比如前面說到的完成“記住密碼”功能,我們存儲的使用者名和密碼,需要和背景約定一種加密方式,不能直接明文存儲。
本文轉自 sshpp 51CTO部落格,原文連結:http://blog.51cto.com/12902932/1926236,如需轉載請自行聯系原作者