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 相关文章推荐
获取表单控件原始(初始)值的方法
Aug 21 Javascript
javascript模拟实现C# String.format函数功能代码
Nov 25 Javascript
使用js完成节点的增删改复制等的操作
Jan 02 Javascript
JavaScript更改原始对象valueOf的方法
Mar 19 Javascript
JavaScript事件处理的方式(三种)
Apr 26 Javascript
jQuery实现腾讯信用界面(自制刻度尺)样式
Aug 15 jQuery
jQuery幻灯片插件owlcarousel参数说明中文文档
Feb 27 jQuery
JavaScript实现京东购物放大镜和选项卡效果的方法分析
Jul 05 Javascript
layui table 获取分页 limit的方法
Sep 20 Javascript
JavaScript接口实现方法实例分析
May 16 Javascript
如何编写一个 Webpack Loader的实现
Oct 18 Javascript
ant design的table组件实现全选功能以及自定义分页
Nov 17 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 include,include_once,require,require_once
2008/09/05 PHP
检查用户名是否已在mysql中存在的php写法
2014/01/20 PHP
PHP实现AES256加密算法实例
2014/09/22 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
PHP实现根据密码长度显示安全条
2017/07/04 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
jQuery 第二课 操作包装集元素代码
2010/03/14 Javascript
js 获取后台的字段 改变 checkbox的被选中的状态 代码
2013/06/05 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
node.js中的url.resolve方法使用说明
2014/12/10 Javascript
jQuery树形控件zTree使用小结
2016/08/02 Javascript
JavaScript模块模式实例详解
2017/10/25 Javascript
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
python计算时间差的方法
2015/05/20 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
Pycharm创建项目时如何自动添加头部信息
2019/11/14 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
迪拜航空官方网站:flydubai
2017/04/20 全球购物
中国旅游网站:途牛旅游网
2019/09/29 全球购物
serialVersionUID具有什么样的特征
2014/02/20 面试题
如何用SQL语句进行模糊查找
2015/09/25 面试题
职称自我鉴定
2013/10/15 职场文书
有针对性的求职自荐信
2013/11/14 职场文书
运动会入场解说词300字
2014/01/25 职场文书
聚美优品励志广告词
2014/03/14 职场文书
文明班集体申报材料
2014/05/23 职场文书
2015年师德师风承诺书
2015/01/22 职场文书
图解上海144收音机
2021/04/22 无线电
python实现简单的井字棋
2021/05/26 Python
HTML5 语义化标签(移动端必备)
2021/08/23 HTML / CSS
Go语言并发编程 sync.Once
2021/10/16 Golang