Cookie


在支持 navigator.cookieEnabled 的浏览器中可以通过该属性判断浏览器是否支持 Cookie。

Cookie 有效期和作用域

Cookie 默认的有效期很短暂,只能持续在 Web 浏览器的会话期间,一旦用户关闭浏览器,Cookie 保存的数据就消失了。Cookie 的有效期可以通过 max-age 来设置(单位:秒);作用域可以通过文档源(domain)和文档路径(path)来设置;可见性可以通过 path 来设置。Cookie还有一个 secure 属性,标记为 true 时表示通过 HTTPS 等安全协议连接时才传递它。

保存 Cookie

Cookie 值中不允许出现分号、逗号和空白符,所以通过 encodeURIComponent 对其进行编码:

document.cookie = "version=" + encodeURIComponent(document.lastModified);

相应地,读取的时候需要采用 decodeURIComponent 函数解码。

要设置 Cookie 的有效期和作用域,可以这么设置:

document.cookie += "; max-age=" + 7*60*60*24;
document.cookie += "; path=/";
document.cookie += "; domain=.example.com";
document.cookie += "; secure=false";

要删除一个 Cookie,将 max-age 设置为 0 即可。

读取 Cookie

// 解析 document.cookie 属性值
function getcookie() {
    var cookie = {};
    var all = document.cookie;
    if (all === "")
        return cookie;
    var list = all.split("; ");
    for (var i = 0; i < list.length; i++) {
        var item = list[i];
        var p = item.indexOf("=");
        var name = item.substring(0, p);
        var value = item.substring(p + 1);
        value = decodeURIComponent(value);
        cookie[name] = value;
    }
    return cookie;
}

Cookie的局限性

Cookie 的设计初衷是用来给服务器端存储少量数据的,该数据会在每次请求时传递到服务器端。RFC 2965 鼓励浏览器限制 Cookie 总数和大小,比如浏览器支持 Cookie 总数不能超过 300 个,单个站点 Cookie 总数不能超过 20 个,单个 Cookie 保存的数据不能超过 4 KB。这就限制了 Cookie 保存数据的数量和大小。

Cookie相关的存储

// 实现基于 Cookie 的存储 API
function cookieStorage(maxage, path) {
    var cookie = (function () {
        var cookies = {};
        var all = document.cookie;
        if (all === "")
            return cookies;
        var list = all.split("; ");
        for (var i = 0; i < list.length; i++) {
            var item = list[i];
            var p = item.indexOf("=");
            var name = item.substring(0, p);
            var value = item.substring(p + 1);
            value = decodeURIComponent(value);
            cookies[name] = value;
        }
        return cookies;
    }());
    
    var keys = [];
    for (var key in cookie)
        keys.push(key);
    
    this.length = keys.length;
    
    this.key = function (n) {
        if (n < 0 || n >= keys.length)
            return null;
        return keys[n];
    };
    
    this.getItem = function (name) {
        return cookie[name] || null;
    };
    
    this.setItem = function (key, value) {
        if (!(key in cookie)) {
            keys.push(key);
            this.length++;
        }
    
        cookie[key] = value;
    
        var setcookie = key + "=" + encodeURIComponent(value);
    
        if (maxage)
            setcookie += "; max-age=" + maxage;
        if (path)
            setcookie += "; path=" + path;
    
        document.cookie = setcookie;
    };
    
    this.removeItem = function (key) {
        if (!(key in cookie)) {
            return;
        }
    
        delete cookie[key];
    
        for (var i = 0; i < keys.length; i++) {
            if (keys[i] === key) {
                keys.splice(i, 1);   // 将其从keys中移除
                break;
            }
        }
        this.length--;
    
        document.cookie = key + "=; max-age=0";
    };
    
    this.clear = function () {
        for (var i = 0; i < keys.length; i++) {
            document.cookie = keys[i] + "=; max-age=0";
        }
        cookie = {};
        keys = [];
        this.length = 0;
    };
}

调用示例:


Vote Vote Cancel Collect Collect Cancel

<< 上一篇: localStorage 和 sessionStorage

>> 下一篇: 利用 IE userData 持久化数据