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 继承详解(三)
Jul 13 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
May 30 Javascript
js中通过split函数分割字符串成数组小例子
Sep 21 Javascript
js中实现多态采用和继承类似的方法
Aug 22 Javascript
javascript使用输出语句实现网页特效代码
Aug 06 Javascript
第六章之辅组类与响应式工具
Apr 25 Javascript
Bootstrap警告(Alerts)的实现方法
Mar 22 Javascript
vsCode安装使用教程和插件安装方法
Aug 24 Javascript
原生js实现抽奖小游戏
Jun 27 Javascript
微信小程序HTTP接口请求封装代码实例
Sep 05 Javascript
微信小程序indexOf的替换方法(推荐)
Jan 14 Javascript
微信小程序实现点击导航条切换页面
Nov 19 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学习之数组的定义和填充
2011/04/17 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
2014/11/18 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
php 输出缓冲 Output Control用法实例详解
2020/03/03 PHP
学习YUI.Ext 第七天--关于View&amp;JSONView
2007/03/10 Javascript
jquery isType() 类型判断代码
2011/02/14 Javascript
js加入收藏夹代码(兼容ie/ff/op)
2014/05/16 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
关于Javascript回调函数的一个妙用
2016/08/29 Javascript
Bootstrap表单简单实现代码
2017/03/06 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
详解微信小程序开发之formId使用(模板消息)
2019/08/27 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
解决vue+router路由跳转不起作用的一项原因
2020/07/19 Javascript
原生js实现分页效果
2020/09/23 Javascript
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
python可视化实现代码
2019/01/15 Python
python如何实现视频转代码视频
2019/06/17 Python
Python Numpy,mask图像的生成详解
2020/02/19 Python
Python退出时强制运行一段代码的实现方法
2020/04/29 Python
python有几个版本
2020/06/17 Python
python读取excel数据并且画图的实现示例
2021/02/08 Python
JACK & JONES瑞典官方网站:杰克琼斯欧式风格男装
2017/12/23 全球购物
复古风格的女装和装饰品:ModCloth
2017/12/29 全球购物
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
Java平台和其他软件平台有什么不同
2015/06/05 面试题
计算机求职信
2013/12/01 职场文书
初一生物教学反思
2014/01/18 职场文书
幼儿生日活动方案
2014/08/27 职场文书
幼儿园感恩节活动方案
2014/10/06 职场文书
泰山导游词
2015/02/02 职场文书
秋收起义观后感
2015/06/11 职场文书
小学庆六一主持词
2015/06/30 职场文书
期中考试后的感想
2015/08/07 职场文书
2019学校运动会开幕词
2019/05/13 职场文书