原來用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 7Domain = tmp.slice(1). ;
寫cookie 的時候,我把domain 設為這個cookieDomain , 這樣一來, 不同的壞境的cookie 就會寫到不同的domain 下面, 看似互不影響.
但是在取的時候, 可以取出來N個相同的key 的cookie 值來! 而我只取第一次出現的cookie, 這樣就造成了取出的值很有可能是錯的. 就這個問題, 客戶單位像狗皮膏藥一樣貼住我了!跟他們解釋了N次,說你們對外只提供一個網址, 瀏覽者的電腦不會出現取值錯誤的情況(因為只有一個 domain ). 可是牙的每次BUG匯總裡,總是會把這個問題列出來! 所有解釋等於對牛彈琴.
木折, 那我就把所有用js 寫的cookie 寫到根域名下吧, 省得這群人叫來叫去,大問題不關注,小問題看賊細賊,本末倒置!
$.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 を取り出して 1 つのオブジェクトに入れていました。考えてみてください。それは正しくありません。 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 ? (t[1]) : "";
}
$.getExpires(new Date().getFull Year() - 1), path, domain);
}
(;);
var t;
for (var i = 0; i