20170618-cookie

Cookie

HTTP Cookie, 平常直接叫做cookie,最初是在客户端用于存储会话信息的。该规范要求服务器对恣意HTTP要求发送Set-Cookie HTTP头作为相应的一部分,个中包括会话信息。这个HTTP相应设置一个以name为称号、以value为值的cookie,称号和值在传送时都必需是URI编码的。浏览器会存储如许的会话信息,并在这今后,通过为每一个要求增加Cookie HTTP头将信息发送回服务器,发送回服务器的分外信息能够用于唯一考证客户端来自于发送的哪一个要求。

Cookie的限定

安全性限定

cookie在性子上是绑定在特定的域名下的。当设定了一个cookie后,再给竖立它的域名发送要求时,都邑包括这个cookie。这个限定确保了存储在cookie中的信息只能让同意的接受者接见,而没法被其他域接见。

数目限定

  • IE6及更低的版本每一个域名限定为20个cookie,IE7及今后的版本每一个域名限定为50个cookie。

  • Firefox每一个域名cookie限定为50个。

  • Opera每一个域名cookie限定为30个。

  • Safari和Chrome对每一个域的cookie的数目限定没有硬性规定

大小限定

大多数浏览器对每一个cookie有约莫4096B的长度限定(约莫4K)

cookie的构成

cookie由浏览器保留的以下几块信息构成

  • 称号

  • 域:cookie对哪一个域是有用的,一切向该域发送的要求中都邑包括这个cookie信息,默认值为设置cookie的谁人域

  • 途径:指定域中的哪一个途径,应当向服务器发送cookie。比方指定该值为http://www.example.com/test1/,则只要该途径下的要求会包括这个cookie

  • 失效时刻: cookie什么时刻应当被删除的时刻戳

  • 安全标志: 指定后,cookie只要在运用SSL衔接时,才会发送到服务器

特别要注意,域、途径、失效时刻、安全标志都是服务器给浏览器的标识,这些参数并不会作为发送到服务器的cookie信息的一部分,只要键值对才会被发送。

JavaScript对cookie的操纵

运用document.cookie能够猎取当前页面可用的一切的cookie构成的字符串,该字符串是有分号离隔的键值对构成(由分号离隔的一个键值对就是一个cookie),比方:name1=value1;name2=value2;name3=value3。一切名字和值都是经由URL编码,所以必需运用decodeURIComponent()来解码。

document.cookie用于设置值的时刻,document.cookie属机能够设置为一个新的字符串,这个cookie字符串会被诠释并增加到现有的cookie鸠合中。设置document.cookie并不会掩盖cookie,除非设置的cookie的称号已存在

var CookieUtil = {
    get: function(name){
        var cookieName = encodeURIComponent(name) + '=',
            cookieStart = document.cookie.indexOf(cookieName),
            cookieValue = null;
        if(cookieStart > -1){
            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){
        // 设置的cookie的称号已存在,将会掩盖原有的cookie
        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=" + secure;
        }
        document.cookie = cookieText;
    },
    // 删除已有cookie
    unset: function(name, path, domain, secure){
        this.set(name, "", new Date(), path, domain, secure);
    }
}

子cookie

为了绕开浏览器的单域名下的cookie数目限定,能够在每一个cookie中寄存多个更小的字段(子cookie)。子cookie最常见的花样以下:

'name=name1=value1&name2=value2&name3=value3'

子cookie平常也以查询字符串的花样举行花样化。然后这些值能够运用单个cookie举行存储和接见,而非对每一个键值对运用差别的cookie存储。末了网站或web应用程序能够无需到达单域名cookie上限也能够存储越发结构化的数据。为了更好地操纵子cookie,必需竖立一系列新方法。子cookie的剖析和序列化会因子cookie的希冀用处而略有差别并越发庞杂些。

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,
            subCookie,
            i,
            parts,
            result = {};
        
        if(cookeStart > -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(i=0, len=subCookies.length; i<len;i++){
                    parts = subCookies[i].split("=");
                    result[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);
                }
                return result;
            }
        }
        return null;
    },
    
    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.toGMTSting();
            }
            if(path){
                cookieText += "; path=" + path;
            }
            if(domain){
                cookieText += "; domain=" + domain;
            }
            if(secure){
                cookieText += "; secure=" + secure;
            }
        } else {
            cookieText += "; expires="+(newDate(0)).toGMTString();
        }
        document.cookie = cookieText;
    },
    
    unset: function(name, subName, path, domain, secure){
        var subcookies = this.getAll(name);
        if(subcookies){
            delete subcookies[subName];
            this.set(name, subcookies, null, path, domain, secure);
        }
    },
    
    unsetAll: function(name, path, domain, secure){
        this.setAll(name, null, new Date(0), path, domain, secure);
    }
};

关于cookie的思索

  • 操纵cookie的时刻须要亲昵关注cookie的长度,以防凌驾单个cookie的长度限定

  • 一切的cookie都邑由浏览器作为要求内容的一部分发送,所以在cookie中存储大批信息会影响到特定域的要求机能。cookie越大,完成对服务器要求的时刻就越长。只管浏览器对cookie举行了大小限定,不过最好照样尽可能在cookie中少存储信息,以防止影响机能。

  • cookie的性子和局限性使其并不能作为存储大批信息的抱负手腕。

    原文作者:jhhfft
    原文地址: https://segmentfault.com/a/1190000009850075
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞