Cookie

Cookie的構成

1、名稱:
一個唯一確定cookie的名稱。
2、值:
儲存在cookie中的字符串值。值必須被URL編碼。
3、域:
cookie對於哪個域是有效的。所有向該域發送的請求中都會包含這個cookie信息。這個值可以包含子域(sudomain,如www.wrox.com),也可以不包含它(如.wrox.com,則對於wrox.com的所有子域都有效)。如果沒有明確設定,那麼這個域會被認作來自設置cookie的那個域。
4、路徑:
對於指定域中的那個路徑,應該向服務器發送cookie。
5、失效時間:
表示cookie何時應該被刪除的時間戳(也就是,何時應該停止向服務器發送這個cookie)。如果你設置的失效時間是以前的時間,則cookie會被立刻刪除。
6、安全標誌:
指定後,cookie只有在使用SSL連接的時候才發送到服務器。secure標誌是cookie中唯一一個非名值對兒的部分,直接包含一個secure單詞。

由於JavaScript中讀寫cookie不是非常直觀,常常需要寫一些函數來簡化cookie的功能。基本的cookie操作有三種:讀取、寫入和刪除。它們在CookieUtil對象中如下表示。有get()方法、set()方法和unset()方法。

var CookieUtil={

    get:function(name){
        var cookieName=encodeURIComponent(name)+"=",
    cookieStart=document.cookie.indexOf(cookieName),
    cookieValue=null;

    if(cookieStart>-1){
        var cookieEnd=document.cookie.indexOf(";",cookieStart);
        if(cookieEnd == -1){
            cookieEnd = document.cookie.length;
        }

        cookieValue=decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length,cookieEnd));
    }
    return cookieValue;

    },


    set:function(name,value,expires,path,domain,secure){
    var cookieText=encodeURIComponent(name) + "=" + encodeURIComponent(value);

    if(expires instanceof Date){
        cookieText += "; expires=" +expires.toGMTString();
    }

    if(path){
        cookieText += "; path=" + path;
    }

    if(domain){
        cookieText += "; domain" +domain;
    }

    if(secure){
        cookieText += "; secure";
    }

    document.cookie=cookieText;
},


    unset:function(name, path ,domain, secure){
        this.set(name, "", new Date(0), path, domain, secure);
    }

};

可以像下面這樣使用上述方法。

//設置cookie
CookieUtil.set("name","Nicholas");
CookieUtil.set("book","Professional JavaScript");

//讀取cookie的值
alert(CookieUtil.get("name"));  //"Nicholas"
alert(CookieUtil.get("book"));  //"Professional JavaScript"

//刪除cookie
CookieUtil.unset("name");
CookieUtil.unset("book");

//設置cookie,包括它的路徑、域、失效日期
CookieUtil.unset("name","Nicholas","/book/projs/","www.wrox.com",new Date("January 1,2010"));


//刪除剛剛設置的cookie
CookieUtil.unset("name","/books/projs","www.wrox.com");

//設置安全的cookie
CookieUtil.set("name","Nicholas",null,null,null,true);

子cookie

爲了繞開瀏覽器的單域名下的cookie數限制,一些開發人員使用了一種稱爲子cookie(subcookie)的概念。子cookie是存放在單個cookie中的更小段的數據。也就是使用cookie值來存儲多個名稱值對兒。子cookie最常見的格式如下所示:

name=name1=value1&name2=value2&name3=value3&name4=value4&name5=value5

子cookie的方法有get()、getAll()、set()、setAll()、unset()、unsetAll()。

由於代碼太長,分成三部分寫:
1、get()、getAll()

var SubCookieUtil={
    get : function(name, subName){
        var subCookies=this.getAll(name);
        if(subCookies){
            return subCookies[subName];
        }else{
            return null;
        }

    },
    getAll :function(name){
            var cookieName=encodeURIComponent(name) + "=",
            cookieStart=document.cookie.indexOf(cookieName),
            cookieValue=null,
            cookieEnd,
            subCookies,
            i,
            parts,
            result={};


        if(cookieStart > -1){
                cookieEnd=document.cookie.indexOf(";",cookieStart);
                if(cookieEnd == -1){
                    cookieEnd = document.cookie.length;
                }
                cookieValue=document.cookie.substring(cookieStart + cookieName.length, cookieEnd);

            if(cookieValue.length > 0){
                subCookies = cookieValue.split("&");
                for(var i=0,len=subCookie.length;i<len; i++){
                    parts=subCookie[i].split("=");
                    result[decodeURIComponent(parts[0])]=decodeURIComponent(parts[1]);

                    }
                    return result;
                }
            }
            return null;
        },
//省略了更多代碼

};

可以像下面這樣使用上述方法:

//假設document.cookie=data=name=Nicholas&book=Professional%20JavaScript

//取得全部子cookie
var data=SubCookieUtil.getAll("data");
alert(data.name);   //"Nicholas"
alert(data.book);   //"Professional JavaScript"

//逐個獲取子Cookie
alert(SubCookieUtil.get("data","name"));    //"Nicholas"
alert(SubCookieUtil.get("data","book"));    //"Professional JavaScript"

2、要設置子cookie,也有兩種方法:set()和setAll()。以下代碼展示了它們的構造:

var SubCookieUtil={
 set:function(name,subName,value,expires,path,domain,secure){
    var subcookies=this.getAll(name)||{};
    subcookies[subName]=value;
    this.setAll(name,subcookies,expires,path,domain,secure);
},

 setAll:function(name,subcookies,expires,path,domain,secure){
    var cookieText=encodeURIComponent(name)+ "=",
    subcookieParts=new Array(),
    subName;

    for(subName in subcookies){
        if(subName.length > 0 && subcookies.hasOwnProperty(subName)){
        subcookieParts.push(encodeURIComponent(subName) + "=" + encodeURIComponent(subcookies[subName]));
        }
    }

if(cookieParts.length > 0){
    cookieText += subcookieParts.join("&");

    if(expires instanceof Date){
        cookieText += "; expires" +expires.toGMTString();       
    }

    if(path){
        cookieText += "; path=" +path;
    }
    if(domain){
    cookieText += "; domain=" +domain;
    }
    if(secure){
    cookieText += "; secure" 
    }
}else{
    cookieText += "; expires=" +(new Date(0)).toGMTString();
}
    document.cookie=cookieText;

},
 //省略了更多代碼

};

可以按如下方式使用這些方法

//假設document.cookie=data=name=Nicholas&book=Professional%20JavaScript

//設置兩個cookie
SubCookieUtil.set("data","name","Nicholas");
SubCookieUtil.set("data","book","Professional JavaScript");

//設置全部子cookie和失效日期
SubCookieUtil.setAll("data",{name:"Nicholas",book:"Professional JavaScript"},new Date("January 1,2010"));

//修改名字的值,並修改cookie的失效日期
SubCookieUtil.set("data","name","Michael",new Date("February 1, 2010"));

3、刪除子cookie的方法unset()和unsetAll()

var SubCookieUtil={
    //這裏省略了更多代碼
    unset :function (name ,subName ,path ,domain ,secure){
        var subcookies=this.getAll(name);
        if(subcookies){
            delete subcookies[subName];
            this.setAll(name,subcookies,null,path,domain,secure);
        }
    },
    unsetAll:function(name,path,domain,secure){
        this.setAll(name,null,new Date(0),path,domain,secure);
    }
};

使用方法:

//僅刪除名爲name的子cookie
SubCookieUtil.unset("data","name");

//刪除整個cookie
SubCookieUtil.unsetAll("data");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章