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 对象的创建与使用
Mar 09 Javascript
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
Jun 28 Javascript
JQuery操作tr和td内容的方法实例
Mar 06 Javascript
jquery实现网站超链接和图片提示效果
Mar 21 Javascript
js判断浏览器类型的方法
Aug 07 Javascript
把字符串按照特定的字母顺序进行排序的js代码
Jan 28 Javascript
用jquery.sortElements实现table排序
May 04 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
Mar 30 Javascript
纯javascript模仿微信打飞机小游戏
Aug 20 Javascript
详谈js遍历集合(Array,Map,Set)
Apr 06 Javascript
js神秘的电报密码 哈弗曼编码实现
Sep 10 Javascript
原生JavaScript写出Tabs标签页的实例代码
Jul 20 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
PHP调用VC编写的COM组件实例
2014/03/29 PHP
PHP 数组黑名单/白名单实例代码详解
2019/06/04 PHP
laravel Validator ajax返回错误信息的方法
2019/09/29 PHP
javascript中的几个运算符
2007/06/29 Javascript
利用js的Node遍历找到repeater的一个字段实例介绍
2013/04/25 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
js实现根据身份证号自动生成出生日期
2015/12/15 Javascript
JavaScript类型系统之布尔Boolean类型详解
2016/06/26 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
2016/07/12 Javascript
浅谈jquery.form.js的ajaxSubmit和ajaxForm的使用
2016/09/09 Javascript
Javascript 获取鼠标当前的位置实现方法
2016/10/27 Javascript
JavaScript定时器实现的原理分析
2016/12/06 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
理解 javascript 中的函数表达式与函数声明
2017/07/07 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
2018/08/29 Javascript
Vue引用Swiper4插件无法重写分页器样式的解决方法
2018/09/27 Javascript
详解JS实现系统登录页的登录和验证
2019/04/29 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
vue实现select下拉显示隐藏功能
2019/09/30 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
Python实现的Google IP 可用性检测脚本
2015/04/23 Python
python使用分治法实现求解最大值的方法
2015/05/12 Python
Python网络编程详解
2017/10/31 Python
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
Django模板语言 Tags使用详解
2019/09/09 Python
python实现滑雪者小游戏
2020/02/22 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
2020/04/09 Python
英国礼品和生活方式品牌:Treat Republic
2020/11/21 全球购物
梅西百货官网:Macy’s
2020/08/04 全球购物
JPA面试常见问题
2016/11/14 面试题
彩色的非洲教学反思
2014/02/18 职场文书
大学生村官座谈会发言材料
2014/05/25 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书