Cookie在浏览器端的应用与操作

Cookie是什么?

        Cookie,通常又称作"cookies”,它是存储在用户主机浏览器中的一小段文本文件,不包含任何可执行代码。某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密),多数需要登录的站点,通常会在你的认证信息通过后,来设置一个cookie,之后只要这个cookie存在并且合法,你就可以自由的浏览这个站点的授权部分。


创建cookie

        通过HTTP的Set-Cookie消息头,Web服务器可以指定存储一个cookie。Set-Cookie消息的格式如下面的字符串(中括号中的部分都是可选的)


        Set-Cookie:value [ ;expires=date][ ;domain=domain][ ;path=path][ ;secure]


        通常性的使用方式是以name=value的格式(并且多数的接口只支持该格式)来指定cookie的值。当一个cookie存在,并且可选条件允许的话,该cookie的值会在接下来的每个请求中被发送至服务器。cookie的值被存储在名为Cookie的HTTP消息头中,并且只包含了cookie的值,其它的选项全部被去除。例如:

        Cookie : value


        通过Set-Cookie指定的选项只是应用于浏览器端,一旦选项被设置后便不会被服务器重新取回。


有效期选项(The expires  option)

        紧跟cookie值后面的每个选项都以分号和空格分割,并且每个选项都指定cookie何时应该被发送到服务器。第一个选项是expires,其指定了cookie何时不会再被发送到服务器端的,因此该cookie可能会被浏览器删掉。该选项所对应的值是一个格式为Wdy,DD-Mon--YYYY HH:MM:SS GMT的值,例如:

        Set-Cookie:name=Nicholas;expires=Sat, 02 May 2009 23:38:25 GMT

        在没有expires选项时,cookie的寿命仅限于单一的会话中。浏览器的关闭意味这一次会话的结束,所以会话cookie只存在于浏览器保持打开的状态之下。这就是为什么当你登录到一个web应用时经常看到一个checkbox,询问你是否选择存储你的登录信息:如果你选择是的话,那么一个expires选项会被附加到登录的cookie中。如果expires选项设置了一个过去的时间点,那么这个cookie会被立即删除。

       

domain选项(The domain option)

        下一个选项是domain,指示cookie将要发送到哪个域或那些域中。默认情况下,domain会被设置为创建该cookie的页面所在的域名。例如本站中的cookie的domain属性的默认值为www.nczonline.com。domain选项被用来扩展cookie值所要发送域的数量。例如:

        Set-Cookie:name=Nicholas;domain=nczonline.net

       想象诸如Yahoo!这样的大型网站都会有许多以name.yahoo.com(例如:my.yahoo.com,finance.yahoo.com,等等)为格式的站点。单独的一个cookie可以简单的通过将其domain选项设置为yahoo.com而发送到所有这些站点中。浏览器会对domain的值与请求所要发送至的域名,做一个尾部比较(即从字符串的尾部开始比较),并且在匹配后发送一个Cookie消息头。

        domain设置的值必须是发送Set-Cookie消息头的域名。例如,我无法向google.com发送一个cookie,因为这个产生安全问题。不合法的domain选项只要简单的忽略即可。


Path选项(The path option)

        另一个控制何时发送Cookie消息头的方式是指定path选项。与domain选项相同的是,path指明了在发Cookie消息头之前必须在请求资源中存在一个URL路径。这个比较是通过将path属性值与请求的URL从头开始逐字符串比较完成的。如果字符匹配,则发送Cookie消息头,例如:

        Set-Cookie:name=Nicholas;path=/blog

        在这个例子中,path选项值会与/blog,/blogrool等等相匹配;任何以/blog开头的选项都是合法的。要注意的是只有在domain选项核实完毕之后才会对path属性进行比较。path属性的默认值是发送Set-Cookie消息头所对应的URL中的path部分。


secure选项(The  secure  option)

        最后一个选项是secure。不像其它选项,该选项只是一个标记并且没有其它的值。一个secure cookie只有当请求是通过SSL和HTTPS创建时,才会发送到服务器端。这种cookie的内容意指具有很高的价值并且可能潜在的被破解以纯文本形式传输。例如

        Set-Cookie:name=Nicholas;secure

        现实中,机密且敏感的信息绝不应该在cookies中存储或传输,因为cookies的整个机制都是原本不安全的。默认情况下,在HTTPS链接上传输的cookies都会被自动添加上secure选项。

cookie的维护和生命周期(cookie maintenance and lifecycle)

        任意数量的选项都可以在单一的cookie中指定,并且这些选项可以以任何顺序存在,例如

        Set-Cookie:name=Nicholas; domain=nczonline.net; path=/blog

        

        这个cooke有四个标识符:cookie的name,domain,path,secure标记。要想在将来改变这个cookie的值,需要发送另一个具有相同cookie name,domain,path的Set-Cookie消息头。例如:

        Set-Cooke:name=Greg; domain=nczonline.net; path=/blog

        

        这将以一个新的值来覆盖原来cookie的值。然而,仅仅只是改变这些选项的某一个也会创建一个完全不同的cookie,例如:

        Set-Cookie:name=Nicholas; domain=nczonline.net; path=/

        

        在返回这个消息头后,会存在两个同时拥有“name”的不同的cookie。如果你访问在www.nczonline.net/blog下的一个页面,以下的消息头将被包含进来:

        Cookie:name=Greg;name=Nicholas


        在这个消息头中存在了两个名为“name”的cookie,path值越详细则cookie越靠前。domain-path越详细则cookie字符串越靠前。假设我在ww.nczonline.net/blog下并且发送了另一个cookie,其设置如下:

        Set-Cookie:name=Mike



下面提供一个JavaScript 操作 Cookie 例子:


var Cookie = new Object();
Cookie.setCookie = function(name, value, option) {
    var str = name + '=' + escape(value);
    if (option) {
        //判断是否设置过期时间
        if (option.expireHours) {
            var d = new Date();
            d.setTime(d.getTime() + option.expireHours * 3600 * 1000);
            str += '; expires=' + d.toGMTString();
        }
        if (option.path)
            str += '; path=' + option.path;
        if (option.domain)
            str += '; domain=' + option.domain;
        if (option.secure)
            str += '; true';
    }
    document.cookie = str;
}
Cookie.getCookie = function(name) {
    //将多cookie切割为多个名/值对
    var arr = document.cookie.split('; ');
    if (arr.length === 0)
        return '';
    //遍历cookie数组,处理每个cookie对
    for (var i = 0; i < arr.length; i++) {
        var tmp = arr[i].split('=');
        if (tmp[0] === name)
            return unescape(tmp[1]);
    }
    return '';
};
Cookie.delCookie = function(name) {
    //document.cookie= name + "=0;path=/;expires=" + new Date(0).toGMTString();
    this.setCookie(name, '', {expireHours: -1});
};
Cookie.clearCookie = function() {
    var arrCookie = document.cookie.split('; ');
    for (var i = 0; i < arrCookie.length; i++) {
        var arr = arrCookie[i].split('=');
        this.delCookie(arr[0]);
    }
};

/**How to use it 
Cookie.setCookie('own', 'this is cookie test!');
alert(Cookie.getCookie('own'));
Cookie.delCookie('own');
alert(Cookie.getCookie('own'));
Cookie.clearCookie();
**/

如需转载,请注明出处: https://chadou.me/p/142

最新发布