javascript与cookie 的问题详解


Posted in Javascript onNovember 11, 2013

原来用 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 汉字字节判断
Aug 01 Javascript
jquery实现弹出层遮罩效果的简单实例
Mar 03 Javascript
jqeury-easyui-layout问题解决方法
Mar 24 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
Sep 25 Javascript
JavaScript实现在标题栏上显示当前日期的方法
Mar 19 Javascript
理解javascript中的严格模式
Feb 01 Javascript
AngularJS bootstrap启动详解及实例代码
Sep 14 Javascript
js querySelector() 使用方法
Dec 21 Javascript
原生js实现商品放大镜效果
Jan 12 Javascript
jQuery学习之DOM节点的插入方法总结
Jan 22 Javascript
JS实现的简单分页功能示例
Aug 23 Javascript
JavaScript实现五子棋小游戏
Oct 26 Javascript
JavaScript设置首页和收藏页面的小例子
Nov 11 #Javascript
JS将表单导出成EXCEL的实例代码
Nov 11 #Javascript
AJAX跨域请求json数据的实现方法
Nov 11 #Javascript
Javascript弹出窗口的各种方法总结
Nov 11 #Javascript
探讨js中的双感叹号判断
Nov 11 #Javascript
js时间戳格式化成日期格式的多种方法
Nov 11 #Javascript
JavaScript中判断对象类型的几种方法总结
Nov 11 #Javascript
You might like
一个odbc连mssql分页的类
2006/10/09 PHP
一棵php的类树(支持无限分类)
2006/10/09 PHP
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
ThinkPHP登录功能的实现方法
2014/08/20 PHP
php fseek函数读取大文件两种方法
2016/10/12 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
jQuery chili图片远处放大插件
2009/11/30 Javascript
JavaScript实现页面滚动图片加载(仿lazyload效果)
2011/07/22 Javascript
从数据结构的角度分析 for each in 比 for in 快的多
2013/07/07 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
js实现文本框输入文字个数限制代码
2015/12/25 Javascript
javacript获取当前屏幕大小
2016/06/04 Javascript
JavaScript手机振动API
2016/06/11 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
Javascript中的async awai的用法
2017/05/17 Javascript
NodeJS实现图片上传代码(Express)
2017/06/30 NodeJs
详解基于Vue2.0实现的移动端弹窗(Alert, Confirm, Toast)组件
2018/08/02 Javascript
react-router 路由切换动画的实现示例
2018/12/03 Javascript
Electron + vue 打包桌面操作流程详解
2019/06/24 Javascript
vue实现图片上传预览功能
2019/12/23 Javascript
浅析Python中的for 循环
2016/06/09 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
django富文本编辑器的实现示例
2019/04/10 Python
Python实现堡垒机模式下远程命令执行操作示例
2019/05/09 Python
浅析Python3中的对象垃圾收集机制
2019/06/06 Python
python轮询机制控制led实例
2020/05/03 Python
python中upper是做什么用的
2020/07/20 Python
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
光荣入党自我鉴定
2014/01/22 职场文书
家长评语大全
2014/01/22 职场文书
远程研修随笔感言
2014/02/10 职场文书
秋季运动会广播稿大全
2014/02/17 职场文书
市政管理求职信范文
2014/05/07 职场文书
教师专业自荐信
2014/05/31 职场文书
蛋糕店创业计划书范文
2014/09/21 职场文书
2019个人工作计划书的格式及范文!
2019/07/04 职场文书