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");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章