javascript讀寫cookie


  這篇介紹javascript里面讀寫cookie的方法。這個方法不是自己寫的,大家都知道,做東西的時候很少自己去寫底層的東西,但不寫一定要去了解,要不然出了問題就不知所雲了。了解這些方法可以分步來了解:

document.cookie:不要把這個想的很復雜,其實就是一個用“; ”分隔(注意是一個分號和一個空格)的成對的name1=value1;name2=value2... ...字符串,w3c上這樣解釋它:該屬性是一個可讀可寫的字符串,可使用該屬性對當前文檔的 cookie 進行讀取、創建、修改和刪除操作。
下面的3個方法都是圍繞着這個對象來進行的。如果你使用的是火狐瀏覽器且安裝了firebug插件且安裝了firecookie插件,現在可以點擊Cookies標簽查看,如下圖1

圖1

    這里我們看到的並不是一個字符串,是因為為了顯示方便firecookie將他們做了分隔。我們可以點擊控制台標簽,在右方命令編輯器中輸入document.cookie,點擊運行,在左方的輸出中皆可以看到cookie的值了,如圖2中的紅色字體。順便說一下firebug超級方便,在控制台中可以運行命令行,也可以運行多行命令,在最右下方有一個紅色的小按鈕,可以在兩種方式之間相互切換。

圖2

    下面接着看這個方法,它其實就是在上面的字符串中找到“__utma=”這樣的一個字符串的位置,然后從“=”后面開始計算,找到分隔符“;”然后截取他,就是這個cookie項的值了。這里解釋一下幾個關鍵變量:

arg:是類似於"__utma"這樣一個字符串,也就是查找要查找的cookie的名字加上一個"="

alen:是上面cookie名字加上“=”的字符串長度

clen:是整個cookie字符串的長度

i:初始值為0,每次循環時設置成當前位置加上alen,當前位置就是從name開始的位置

j:初始值為0,每次循環時設置成value結束的位置

stringObject.substring(start,stop):
start     必需。一個非負的整數,規定要提取的子串的第一個字符在 stringObject 中的位置。
stop     可選。一個非負的整數,比要提取的子串的最后一個字符在 stringObject 中的位置多1。如果省略該參數,那么返回的子串會一直到字符串的結尾。

stringObject.indexOf(searchvalue,fromindex):
searchvalue     必需。規定需檢索的字符串值。
fromindex     可選的整數參數。規定在字符串中開始檢索的位置。它的合法取值是 0 到 stringObject.length - 1。如省略該參數,則將從字符串的首字符開始檢索。

    以上是getcookie方法的邏輯,下面是setCookie,注意這里的setcookie並沒有修改整個cookie字符串的值,而是新添加一個cookie,這個方法沒有什么邏輯,但是要注意里面的參數,要不然會帶來很多的問題,下面一一列舉。

name:要設置的cookie的名字
expires:cookie的過期時間,如果沒有這個參數的話,注意這里要使用格林威治時間,沒有給給出這個參數,就不會保存到硬盤中而是內存中,這樣上面的過期時間就不會顯示,而是顯示成會話,如下圖3
path:這個參數表示cookie保存的路徑,如果沒有給出的話會保存為當前站點的,如果給出值"/"的話會保存到當前虛擬目錄,如圖3,前面兩個保存在當前站點,后面兩個保存在當前站點下不同的虛擬目錄下
domain:這個參數有點類似於session的保存路徑,默認情況下保存在當前客戶端,也可以保存在其他有寫權限的機器上,本人暫時沒有用到
secure:這個參數應該和安全有關,也沒有用到,因為一般保存到cookie數據都是一些搜索歷史之類的

圖3
  

  注意這里我們使用escape和unescape對cookie的值進行編碼和解碼。

escape(string):escape() 函數可對字符串進行編碼,這樣就可以在所有的計算機上讀取該字符串。該方法不會對 ASCII 字母和數字進行編碼,也不會對下面這些 ASCII 標點符號進行編碼: * @ - _ + . / 。其他所有的字符都會被轉義序列替換。
unescape(string) :unescape() 函數可對通過 escape() 編碼的字符串進行解碼。該函數的工作原理是這樣的:通過找到形式為 %xx 和 %uxxxx 的字符序列(x 表示十六進制的數字),用 Unicode 字符 \u00xx 和 \uxxxx 替換這樣的字符序列進行解碼。

    這里說個題外話,我們知道session和cookie關系密切,每個session都有一個sessionid,這個sessionid也是保存在cookie中,名字叫ASP.NET_SessionId,見圖3,我們可以看到這是一個會話cookie,並不是保存在硬盤中,沒有過期時間,所以一段關閉瀏覽器,session就消失了,再打開瀏覽器的時候就找不到session值了,就是因為這個sessionid丟失了。如果將用戶登陸賬號保存在session中,關閉瀏覽器登錄狀態就會消失,需要重新登錄,就是這個原因。

    最后看一下這兩個函數的原型。

// utility function called by getCookie()
function getCookieVal(offset) {
    var endstr = document.cookie.indexOf(";", offset);
    if (endstr == -1) {
        endstr = document.cookie.length;
    }
    return unescape(document.cookie.substring(offset, endstr));
}

// primary function to retrieve cookie by name
function getCookie(name) {
    var arg = name + "=";
    var alen = arg.length;
    var clen = document.cookie.length;
    var i = 0;
    while (i < clen) {
        var j = i + alen;
        if (document.cookie.substring(i, j) == arg) {
            return getCookieVal(j);
        }
        i = document.cookie.indexOf(" ", i) + 1;
        if (i == 0) break;
    }
    return null;
}

// store cookie value with optional details as needed
function setCookie(name, value, expires, path, domain, secure) {
    document.cookie = name + "=" + escape(value) +
    ((expires) ? "; expires=" + expires : "") +
    ((path) ? "; path=" + path : "") +
    ((domain) ? "; domain=" + domain : "") +
    ((secure) ? "; secure" : "");
}

// remove the cookie by setting ancient expiration date
function deleteCookie(name, path, domain) {
    if (getCookie(name)) {
        document.cookie = name + "=" +
      ((path) ? "; path=" + path : "") +
      ((domain) ? "; domain=" + domain : "") +
      "; expires=Thu, 01-Jan-1970 00:00:01 GMT";

    }
}

 

// utility function called by getCookie()
function getCookieVal(offset) {
    var endstr = document.cookie.indexOf(";", offset);
    if (endstr == -1) {
        endstr = document.cookie.length;
    }
    return unescape(document.cookie.substring(offset, endstr));
}

// primary function to retrieve cookie by name
function getCookie(name) {
    var arg = name + "=";
    var alen = arg.length;
    var clen = document.cookie.length;
    var i = 0;
    while (i < clen) {
        var j = i + alen;
        if (document.cookie.substring(i, j) == arg) {
            return getCookieVal(j);
        }
        i = document.cookie.indexOf(" ", i) + 1;
        if (i == 0) break;
    }
    return null;
}

// store cookie value with optional details as needed
function setCookie(name, value, expires, path, domain, secure) {
    document.cookie = name + "=" + escape(value) +
    ((expires) ? "; expires=" + expires : "") +
    ((path) ? "; path=" + path : "") +
    ((domain) ? "; domain=" + domain : "") +
    ((secure) ? "; secure" : "");
}

// remove the cookie by setting ancient expiration date
function deleteCookie(name, path, domain) {
    if (getCookie(name)) {
        document.cookie = name + "=" +
      ((path) ? "; path=" + path : "") +
      ((domain) ? "; domain=" + domain : "") +
      "; expires=Thu, 01-Jan-1970 00:00:01 GMT";

    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM