cookie

HTTP Cookie,是在客户端用于存储会话信息的。规范要求服务器对任意HTTP请求发送Set-Cookie HTTP头作为响应的一部分,其中包含会话信息。浏览器会存储这样的会话信息,并在这之后,通过为每个请求添加Cookie HTTP头将信息发送给服务器。Http协议是无状态的,对于同一个浏览器发出的多个请求,web服务器是无法区分来源,cookie在客户端解决这个问题。发送回服务器的额外信息可以用于验证请求是来自哪个客户。

限制:

①  Cookie无法跨域,只能是相同域、相同协议内使用。

②  每个域的Cookie总数是有限的。当超过单个域名数量限制之后,浏览器会根据自身规则清除以前设置的cookie。

③  浏览器中对于cookie的大小也有限制,一般一个域下所有的cookie大小不超过4kb,如果超过那么该cookie就会被悄无声息地丢掉。

cookie的字段

  name:必须,名称是不分大小写的,实践中最好是将cookie名称看做是区分大小写的,因为某些服务器会处理cookie。在传送时必须被URL编码。

  value:必须,cookie的字符串值。在传送时必须被URL编码。

  domain:该cookie对于哪个域是有效的。所有从该域资源内发出的请求都会包含这个cookie信息。如果没有明确设定,那么这个域会被认作来自设置cookie的那个域。

  path:指定域中的哪个路径,应该向服务器发送cookie信息。     

  expires/Max-Age :当前cookie何时应该被删除的时间戳。若设置其值为一个时间(GMT格式的日期,注意客户端的时区设定),那么当到达此时间后,此cookie会被删除。如果设置的值是负值或0,cookie也会被立即删除。不显示设置的话默认值是session,即cookie和session的有效期一样。当浏览器关闭后(不是浏览器窗口标签,而是浏览器应用) ,会话结束,cookie/session被清除。

  HttpOnly若此属性为true,则只有在http请求头中会带有此cookie的信息,而不能通过document.cookie来访问此cookie。

  secure :cookie只有在使用SSL连接的时候才发送到服务器。

JavaScript中的cookie

document.cookie返回当前可用的(根据cookie的域、路径、失效日期和安全设置)所有的cookie字符串,每条记录由分号隔开(如name1=value1;name2=value2)。

注意:

1.所有名字和值都是经过URL编码的,所以必须使用decodeURLComponent()来解码。

2.document.cookie也可以设置一个新的cookie字符串,这个cookie字符串会被解释并添加到现有的cookie集合中。设置document.cookie并不会覆盖cookie,除非设置的cookie的名称已经存在。一次只能设置一条cookie信息,多余的cookie会被丢弃。

       document.cookie=”userName=kevin;expires=expiration_time”

3.javascript和动态页只能设置过期时间,无法获取cookie过期的时间,因为其他信息被浏览器隐藏,但在chrome的application下可以查看到失效时间。

It is not possible to get the expiration date of a cookie through Javascript; only key-value pairs are exposed through document.cookie.

4.expires=NaN时,ie8下cookie被立即删除;ie8+及chrome时,会生效,有效时间为365天。

  expries=0或负数时,当前cookie会被立即删除,不会被保存到内存中,也不会被持久化。

  

格林尼治时间(GMT)已经不再被作为标准时间使用,现在的标准时间为协调世界时(UTC),由原子钟提供。toUTCString()和toGMTString()在同一个浏览器中输出一样。

将对cookie的操作封装成JS库:

(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(factory);
    } else if (typeof exports === 'object') {
        // Node. Does not work with strict CommonJS, but
        // only CommonJS-like enviroments that support module.exports, like Node.
        module.exports = factory();
    } else {
        // Browser globals (root is window)
        root.Cookie = factory();
    }
}(this, function () {
    // Just return a value to define the module export.
    // This example returns an object, but the module
    // can return a function as the exported value.
    var Cookie = function () {
        this.set = function (name, value,days, path) {
            var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value);
            if (days) {
                var now = new Date();
                now.setDate(now.getDate()+days);
                cookieText += "; expires=" +now.toUTCString();
            }
            if (path) {
                cookieText += "; path=" + path;
            }
            document.cookie = cookieText;
        };
        this.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;
        };
        this.del = function (name, path){
            this.set(name, '',0, path);
        }
    };
    return new Cookie;
}));

 

posted @ 2017-04-12 19:17  开发之路  阅读(270)  评论(0编辑  收藏  举报