javascript与cookie 的问题详解
javascript与cookie 的问题详解
发布时间:2016-12-30 来源:查字典编辑
摘要:原来用js读写cookie一直没有注意一个问题:相同的key值,不同的domain(locahost.dev.xxx.com,dev.xxx...

原来用 js 读写 cookie 一直没有注意一个问题:

相同的 key 值,不同的 domain (locahost.dev.xxx.com, dev.xxx.com, xxx.com 等) 是可以同时存在于Cookie 里的 , document.cookie 能把这几个 cookie 都读出来,但是没有 domain 信息. 我也试着找用什么方法能把 cookie 的 domain 信息读取出来,可是很不幸, 没有找到(不知道你有没有什么方法能把 domain 信息给读出来, 如有,请赐教)

出现这个问题的场景:

刚开始的时候,是想让 本地(localhost.dev.xxx.com) 和 dev (dev.xxx.com) 与 uat (xxx.com) 环境的 cookie 互不影响, 我跟据 location.hostname 生成 cookieDomain

1 var cookieDomain = document.domain; 2 3 var tmp = location.hostname.split(.); 4 5 if(tmp.length > 2)6 7 cookieDomain = tmp.slice(1).join(.);

写 cookie 的时候,我把 domain 设为这个 cookieDomain , 这样一来, 不同的坏境的 cookie 就会写到不同的 domain 下面, 看似互不影响.

但是在取的时候, 可以取出来N个相同的 key 的 cookie 值来! 而我只取第一次出现的 cookie, 这样就造成了取出的值很有可能是错的. 就这个问题, 客户单位像狗皮膏药一样贴住我了!跟他们解释了N次,说你们对外只提供一个网址, 浏览者的电脑不会出现取值错误的情况(因为只有一个 domain ). 可是牙的每次BUG汇总里,总会把这个问题列出来! 所有解释等于对牛弹琴.

木折, 那我就把所有用 js 写的 cookie 写到根域名下吧, 省得这帮家伙叫来叫去,大问题不关注,小问题看贼细贼,本末倒置!

复制代码 代码如下:

(function(){

// 清除旧版本的 cookie

if(CTSZ.Cookie.get("cookieVersion") != Params.cookieVersion){

var tmps = Params.orgDomain.split(.);

var domain;

var len = tmps.length;

for(var i=0;i<= len - 3; i++){

tmps.shift();

domain = tmps.join(.);

CTSZ.Cookie.empty("/", domain);

}

CTSZ.Cookie.set("cookieVersion", Params.cookieVersion, Params.cookieExpires, "/", Params.cookieDomain);

}

})();

$.Cookie = {};

(function ($) {

$.getExpires = function (y, m, d, h, i, s, ms) {

var date = new Date();

y = isNaN(y) ? date.getFullYear() : y;

m = isNaN(m) ? date.getMonth() : m - 1;

d = isNaN(d) ? date.getDate() : d;

h = isNaN(h) ? date.getHours() : h;

i = isNaN(i) ? date.getMinutes() : i;

s = isNaN(s) ? date.getSeconds() : s;

ms = isNaN(ms) ? date.getMilliseconds() : ms;

return new Date(y, m, d, h, i, s, ms).toUTCString();

}

$.getExpiresByUTCString = function (UTCString) {

var s = new Date(UTCString).toUTCString();

if (s == NaN || s == Invalid Date)

return null; // IE,Opera NaN , FF,Safari Invalid Date;

else

return s;

}

$.set = function (k, v, expires, path, domain, secure) {

var cookie = k + = + encodeURIComponent(v);

if (expires) cookie += ";expires=" + expires;

if (path) cookie += ";path=" + path;

if (domain) cookie += ";domain=" + domain;

if (secure) cookie += ";secure";

document.cookie = cookie;

}

/*

以前是把所有 cookie 都取出放到一个对象里,在 get 的时候,直接从那个对象里取来,现在想想,那样并不正确。因为假如某个 cookie 的过期时间过了,那个对象并没有更新。

*/

$.get = function (k) {

var cks = document.cookie.split(;);

var t;

for (var i = 0; i < cks.length; i++) {

t = cks[i].split(=);

if (k == t[0].trim()) return t.length >= 2 ? decodeURIComponent(t[1]) : "";

}

return null;

}

$.remove = function (k, path, domain) {

$.set(k, , $.getExpires(new Date().getFullYear() - 1), path, domain);

}

$.empty = function (path, domain) {

var cks = document.cookie.split(;);

var t;

for (var i = 0; i < cks.length; i++) {

$.remove(cks[i].split(=)[0].trim(), path, domain);

}

}

})($.Cookie);

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新Javascript教程学习
热门Javascript教程学习
编程开发子分类