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 MD4
Dec 20 Javascript
JavaScript 高效运行代码分析
Mar 18 Javascript
JS实现一键回顶功能示例代码
Oct 28 Javascript
js和jquery如何获取图片真实的宽度和高度
Sep 28 Javascript
jQuery设置和移除文本框默认值的方法
Mar 09 Javascript
jQuery插件passwordStrength密码强度指标详解
Jun 24 Javascript
ThinkJS中如何使用MongoDB的CURD操作
Dec 13 Javascript
ng2学习笔记之bootstrap中的component使用教程
Mar 09 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
Jun 13 Javascript
使用 vue 实现灭霸打响指英雄消失的效果附demo
May 06 Javascript
微信小程序中button去除默认的边框实例代码
Aug 01 Javascript
微信小程序拖拽排序列表的示例代码
Jul 08 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一些服务器端特性的配置加强php的安全
2006/10/09 PHP
Zend的MVC机制使用分析(二)
2013/05/02 PHP
基于php中使用excel的简单介绍
2013/08/02 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
2015/04/15 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
2019/10/08 PHP
php字符串函数 str类常见用法示例
2020/05/15 PHP
jQuery EasyUI API 中文文档 - Parser 解析器
2011/09/29 Javascript
jQuery之日期选择器的深入解析
2013/06/19 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
jquery操作 iframe的方法
2014/12/03 Javascript
JavaScript中的setMilliseconds()方法使用详解
2015/06/11 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
浅析JS原型继承与类的继承
2016/04/07 Javascript
js Canvas绘制圆形时钟效果
2017/02/17 Javascript
jQuery实现在HTML文档加载完毕后自动执行某个事件的方法
2017/05/08 jQuery
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
ES6中Array.includes()函数的用法
2017/09/20 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
2018/03/06 Javascript
JavaScript中的null和undefined用法解析
2019/09/30 Javascript
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
2019/01/29 Python
Django框架模板的使用方法示例
2019/05/25 Python
解决python -m pip install --upgrade pip 升级不成功问题
2020/03/05 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
python 常见的反爬虫策略
2020/09/27 Python
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
如何获得EntityManager
2014/02/09 面试题
资产经营总监岗位职责
2013/12/04 职场文书
西式婚礼证婚词
2014/01/12 职场文书
幼儿园中秋节活动方案
2014/02/06 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
2016年社区国庆节活动总结
2016/04/01 职场文书
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android