javascript與cookie 的問題詳解
原來用 js 讀寫 cookie 一直沒有注意一個問題:
相同的 key 值,不同的 domain (locahost.dev.xxx.com, dev.xxx.com, xxx.com 等) 是可以同時存在于Cookie 里的 , document.cookie 能把這幾個 cookie 都讀出來,但是沒有 domain 信息. 我也試著找用什么方法能把 cookie 的 domain 信息讀取出來,可是很不幸, 沒有找到(不知道你有沒有什么方法能把 domain 信息給讀出來, 如有,請賜教)
出現(xiàn)這個問題的場景:
剛開始的時候,是想讓 本地(localhost.dev.xxx.com) 和 dev (dev.xxx.com) 與 uat (xxx.com) 環(huán)境的 cookie 互不影響, 我跟據(jù) 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 設(shè)為這個 cookieDomain , 這樣一來, 不同的壞境的 cookie 就會寫到不同的 domain 下面, 看似互不影響.
但是在取的時候, 可以取出來N個相同的 key 的 cookie 值來! 而我只取第一次出現(xiàn)的 cookie, 這樣就造成了取出的值很有可能是錯的. 就這個問題, 客戶單位像狗皮膏藥一樣貼住我了!跟他們解釋了N次,說你們對外只提供一個網(wǎng)址, 瀏覽者的電腦不會出現(xiàn)取值錯誤的情況(因為只有一個 domain ). 可是牙的每次BUG匯總里,總會把這個問題列出來! 所有解釋等于對牛彈琴.
木折, 那我就把所有用 js 寫的 cookie 寫到根域名下吧, 省得這幫家伙叫來叫去,大問題不關(guān)注,小問題看賊細賊,本末倒置!
(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 的時候,直接從那個對象里取來,現(xiàn)在想想,那樣并不正確。因為假如某個 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);
相關(guān)文章
JavaScript?中的?parseInt()?函數(shù)詳解
parseInt函數(shù)將其第一個參數(shù)轉(zhuǎn)換為一個字符串,對該字符串進行解析,然后返回一個整數(shù)或?NaN,這篇文章主要介紹了JavaScript?的?parseInt()?函數(shù),需要的朋友可以參考下2023-05-05JS構(gòu)造函數(shù)與原型prototype的區(qū)別介紹
下面小編就為大家?guī)硪黄狫S構(gòu)造函數(shù)與原型prototype的區(qū)別介紹。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-07-07Express實現(xiàn)前端后端通信上傳圖片之存儲數(shù)據(jù)庫(mysql)傻瓜式教程(一)
這篇文章主要介紹了Express實現(xiàn)前端后端通信上傳圖片存儲數(shù)據(jù)庫(mysql)傻瓜式教程(一),需要的朋友可以參考下2015-12-12詳解PHP中pathinfo()函數(shù)導致的安全問題
這篇文章主要給大家介紹了PHP中pathinfo()函數(shù)導致的安全問題,文中給出了詳細的介紹與示例代碼,相信對大家的理解和學習具有一定的參考借鑒價值,需要的朋友可以參考下,下面來一起看看吧。2017-01-01用js限制網(wǎng)頁只在微信瀏覽器中打開(或者只能手機端訪問)
這篇文章主要介紹了用js限制網(wǎng)頁只在微信瀏覽器中打開,很多電影站也是這么限制的,原因你懂的,需要的朋友可以參考下2020-01-01js類型轉(zhuǎn)換與引用類型詳解(Boolean_Number_String)
本篇文章主要是對js中的類型轉(zhuǎn)換與引用類型(Boolean_Number_String)進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-03-03