首页 > 网站 > WEB开发 > 正文

关于 cookie 使用中遇到的问题

2024-04-27 14:10:19
字体:
来源:转载
供稿:网友

关于 cookie 使用中遇到的问题

前段时间在一个项目中涉及到cookie的存取,于是打算封装一个 cookie 的CRUD 。按理来说,这本身是一个很简单的问题,不注意的话简单的问题也有大坑。

  1 /**  2  * Set or get cookie ;parse to object  3  *  4  *@date 2015-04-11  5  *  6  *@author 飘摇的枫叶  7  *  8  *  9  * 10  */ 11 'use strict'; 12 (function (window) { 13     // class2type  refer to zepto.js $.type(obj) ## https://github.com/madrobby/zepto 14     var class2type = {}, 15         toString = class2type.toString; 16     "Boolean Number String Function Array Date RegExp Object Error".split(" ").forEach(function(name) { 17         class2type["[object " + name + "]"] = name.toLowerCase(); 18     }); 19  20     var _qcookie = { 21         cookies: document.cookie, 22         get: function(name) { 23             return this.all()[name]; 24         }, 25         /* 26          *Set cookie 27          * 28          *@param    {string}  cookieName  29          *@param    {string}   cookieValue 30          *  or 31          *@param    {object}   cookieObject{key:value} 32          * 33          *@param    {object}   options{path:'/demo';domain:'/';expire:new Date();secure:0|1} 34          */ 35         set: function(name, value, options) { 36             var opt = options || {}; 37             if (!name) return; 38             if (type(name) === 'string' && value) { 39                 this.write(name, value, opt); 40             } else if (type(name) === 'object') { 41                 opt = value || {}; 42                 for (var k in name) { 43                     this.write(k, name[k], opt); 44                 } 45             } 46             // if (type(name) === 'string' && value) { 47             //     str = encode(name) + '=' + encode(value) + '; '; 48             // } else if (type(name) === 'object') { 49             //     opt = value || {}; 50             //     for (var k in name) { 51             //         str += encode(k) + '=' + encode(name[k]) + '; '; 52             //     } 53             // } 54             // if (opt.path) str += 'path=' + opt.path; 55             // if (opt.domain) str += 'domain=' + opt.domain; 56             // if (opt.expires) str += 'expires=' + opt.expires.toUTCString(); 57             // if (opt.secure) str += 'secure'; 58             // document.cookie = str; 59         }, 60         all: function() { 61             return this.parse(this.cookies); 62         }, 63         delete: function(name) { 64             var expires = new Date(); 65             expires.setDate(expires.getDate() - 1); 66             document.cookie = name + "=" + this.get(name) + '; expires=' + expires.toUTCString(); 67         }, 68         write: function(name, value, opt) { 69             var str = encode(name) + '=' + encode(value); 70             if (opt.path) str += '; path=' + opt.path; 71             if (opt.domain) str += '; domain=' + opt.domain; 72             if (opt.expires) str += '; expires=' + opt.expires.toUTCString(); 73             if (opt.secure) str += '; secure'; 74             document.cookie = str; 75         }, 76         parse: function(cookieStr) { 77             var obj = {}; 78             var arrs = cookieStr.split(/ *; */); // Similar with the split(';') + trim() 79             var kv = []; 80             if (arrs[0] == '') { 81                 return obj; 82             } 83             for (var i = 0; i < arrs.length; i++) { 84                 kv = arrs[i].split('='); 85                 obj[decode(kv[0])] = decode(kv[1]); 86             } 87             return obj; 88         } 89     } 90  91     function encode(str) { 92         return encodeURIComponent(str); 93     } 94  95     function decode(str) { 96         return decodeURIComponent(str); 97     } 98  99     function type(obj) {100         return obj == null ? String(obj) :101             class2type[toString.call(obj)] || "object"102     }103     window.qcookie = _qcookie;104 })(window)

  仔细一看你会发现这里面会有个很严重的问题,当不同域或者不同path的同名cookie 在读和删除的时候都会有问题 ,由于 cookie 的 domain , path 等属性是只写的,你读取到的两个cookie 结构可能是完全一样的,根本无法区分,类似这样,

由于我采用的是将cookie parse 一个对象, 当你只传一个name 的时候,第二个 'aaa' 必然会将第一个 'aaa' 的值给覆盖掉,,这个问题一时间还真没想到什么好的办法解决,又或者设计的时候压根就没有考虑过这个问题,因为实际项目中可能并不会出现这么看上去很傻X的使用场景,然而多了解一点总是极好的。

而删除的话,cookie 本身并没有提供删除的api , cookie 的删除完全是已写cookie的方式,加上一个失效时间,所以删除时指定path cookie 通过设置domain , path 还是可以做到的。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表