天天看點

cookiecookie 屬性,有效期和作用域儲存cookie讀取cookiecookie的局限性

cookie

cookie是指web浏覽器儲存的少量資料,同時也是與具體頁面有關的。

cookie會自動在web伺服器和web浏覽器中傳輸。

cookie 是用來儲存狀态的。即使用者登入,一個網站如何判斷使用者登入的時候,會直接通過從用戶端接收到的cookie來擷取的。

cookie 屬性,有效期和作用域

除了名(name)和值(value),cokie持續有效時間很短,隻能持續在web浏覽器的會話期間。一旦使用者關閉浏覽器,使用者儲存的資料就全部丢失。cookie需要設定有效期。即設定max-age屬性,通過設定其屬性完成對cookie有效期的設定。

設定了有效期以後,cookie資料會儲存在一個檔案中,直到過了指定的有效期才會删除檔案。

cookie擁有作用域,其作用域是通過文檔源和文檔路徑設定的。預設情況下,cookie和建立其的web頁面有關。并對同目錄和其子目錄的其他web頁面可見。對父級目錄不可見。

一個栗子,當使用者在頁面輸入了其電子郵件位址,需要儲存下來,這個時候希望整個網站都使用其電子郵件位址,這個時候,通過設定cookie中的path屬性即可實作作用域為全部。

如果将路徑設定為/ 即讓cookie和localStorage擁有同樣的作用域。同時當其請求該站點上的任何一個web頁面的時候,浏覽器都必須将cookie的名字和值傳遞給伺服器。

這裡需要注意一點的是,如果一個web頁面,想要讀取其他頁面的cookie,隻需要随便加載一個頁面,并使用iframe标簽,即可讀取對應文檔的cookie,此操作受到同源的限制。

如果需要子域名之間能共享cookie此時需要設定cookie的domain 如果沒有為一個cookie設定域屬性,那麼domain屬性的預設值為目前web伺服器的主機名。

cookie的另外一個屬性為secure 其為布爾值,用來表明通過哪種網絡傳遞。cookie預設是不安全的傳遞,即可以通過http傳遞,一旦設定為true的時候,必須通過https進行傳遞。

總結

名稱 含義
Name 儲存的名稱
Value
Domain 用于域的共享,實作子域的互通
Path 設定cookie的路徑
secure 表明cookie是否以不安全的方式傳遞

儲存cookie

cookie為鍵值對。

即需要按照以下的字元串進行設定

name = value           

如下所示

document.cookie = "version=" + encodeURIComponent(document.lastModified);           

由于cookie中儲存的不允許包含分号,逗号,空白符,是以在儲存前使用encodeURIComponent()核心函數進行編碼,解碼的時候使用encodeURIComponent()函數解碼

和POST中的請求體類似。

如果設定天數,需要按照以下的字元串進行設定

name = value; max-age = seconds           

下面的函數是設定一個cookie的值

// 以名/值的形式儲存cookie
// 同時采用JavaScript核心函數encodeURIComponent()函數進行對值的編碼
// daysToLive的值為天
function setcookie(name, value, daysToLive) {
    var  cookie = name + "=" + encodeURIComponent(value);
    // 如果傳入的天數為數字格式的
    if (typeof daysToLive === "number") 
        cookie +=  "; max-age=" + (daysToLive*60*60*24);    // 由于上一個已經是一條,需要使用; 來作為結束
    document.cookie = cookie;    // 将字元串傳入cookie
}           

同樣的如果想要 繼續設定cookie的值,還需要繼續在後面加上值

; path = path
; omainn = domain
; secure           

如果要删除cookie,需要設定同樣名字的即可完成。

讀取cookie

因為讀取的是一個字元串,是以需要使用split()方法将cookie的值中的名值對進行分離。使用JSON.parse()将其轉化為JSON對象

// 将docuemnt.cookie 的值以名值對組成的一個對象傳回
// 假設儲存cookie的值的時候是采用encodeURIComponent()函數進行編碼的
function getcookie() {
    var cookie = {};    // 初始化要儲存的對象
    var all = document.cookie;    // 在一個字元串中擷取cookie的值
    if (all === "") 
        return cookie;    // 如果傳回的是一個空對象
    var list = all.split(";");    // 進行分離
    for(var i = 0; i < list.length; i++) {
        var cookie = list[i];    
        var p = cookie.indexOf("=");    // 查詢第一個=
        var name = cookie.substring(0, p);    // 擷取cookie的名字
        var value = cookie.substring(p+1);    // 擷取cookie對應的值
        value = decodeURIComponent(value);    // 對其值進行解碼
        cookie[name] = value;    // 将名/值對儲存到對象中
    }
    return cookie;    // 傳回cookie
}           

cookie的局限性

對cookie數量,大小有限制。

繼續閱讀