js讀寫Cookie問題(Cookie儲存時長、Cookie儲存域)彙總
var cookie =name+'='+encodeURIComponent(value)+';' //設定Cookie的名稱和Cookie的值,Cookie名稱為必填項。 if(typeof day === 'number'){
cookie+=';max-age='+(day*60*60*24); //設定Cookie的過期事件,預設為Session } if(!path){cookie+=';path=/'} //設定Cookie的路徑,預設為 / if(domain){cookie+';domain='+domain} //設定Cookie的儲存域,預設為當前js執行的網頁的域 document.cookie= cookie;
} 什麼是一條Cookie
什麼是第一方Cookie,第三方Cookie 所謂第一方Cookie,和第三方Cookie,這是一個相對定義。 第一方Cookie:儲存在(domain值為),當前域 或
function getCookie(name){ var arr,reg=new RegExp("(^| )*"+name+"=([^;]*)(;|$)"); if(arr=document.cookie.match(reg)){ return unescape(arr[2]); }else{return null} } js讀取同名Cookie的順序問題 從上面對唯一Cookie的描述中中可以看出,名稱相同也可能時不同的Cookie,那就有了讀js讀取同名Cookie的問題,在讀取同名Cookie的順序不是個可控的。 例如:寫入4個Cookie,(雖然如下四個Cookie名相同,但是他們儲存的domain不同,所以都可以存在)
document.cookie='cookie_name=cookie_value5;path=/;'+'max-age=Session;'
document.cookie='cookie_name=cookie_value4;path=/;domain='+'www.site.net;max-age=Session;'
document.cookie='cookie_name=cookie_value3;path=/;domain='+'.site.net;max-age=Session;'
document.cookie='cookie_name=cookie_value2;path=/xxxx;domain='+'.site.net;max-age=222222;'
執行讀Cookie的方法時,getCookie('cookie_name'),是把document.cookie中出現的第一個,Cookie名稱為cookie_name的值讀取出來(如果全部執行上述程式碼,getCookie('cookie_name')的返回值為cookie_value5)。
在執行document.cookie(寫Cookie)時,是一個累加的過程。
document.cookie = 原來的Cookie(document.cookie)+ 現在需要寫入的Cookie;
注:如果在寫一個,同路徑(path相同),且同域(domain值相同),Cookie名稱相同(如Cookie名稱為 C1),(除了Cookie值和儲存時長外)全部相同的,瀏覽器處理邏輯為。
1)刪除原來的Cookie(名稱為相同Cookie名稱的C1的Cookie);
2)執行document.cookie = 原來的Cookie(document.cookie)+ 現在需要寫入的Cookie(名稱為C1的Cookie);
JS刪除Cookie的原理
正是因為Cookie處理邏輯(在執行document.cookie(寫Cookie),是一個累加的過程,見上面描述),所以js才可以實現對未過期的Cookie進行刪除操作。
刪除Cookie有兩種辦法:
1,把它的值設定為空;
寫一個同名(name值相同),同域(domain值相同),同路徑(path值相同),同時長/不同時長(max-age/expires值相同/不同),但值為空(value為空)的Cookie;
2,把這個Cookie的過期時間設定為已經過去的一個時間點,例如,昨天,去年。
寫一個同名(name值相同),同域(domain值相同),同路徑(path值相同),值為空/不為空(value為空/不為空)的Cookie,但時長為過去時間/值為下一毫秒就過期(max-age/expires的值為上一分鐘,去年,昨天等值,或者為max-age=1毫秒等);
js讀Cookie的一些問題1、js無法讀取Cookie的domain屬性;
2、Cookie的Secure屬性,如果設定了,則只有在HTTPS的協議下,才能傳遞值,HTTP協議下讀不到該值。
3、在寫Cookie時,如果設定了path路徑不是/,而是固定的一個路徑,那麼只有在該路徑下的頁面中執行讀取Cookie,才可以讀取資料。
4、想要讀取父域中Cookie的值,需要將這個Cookie的域寫為(.site.com),如果寫為(site.com)則只有http://site.com中才可以讀取到值。http://www.site.com可以讀取(.site.com)以及(www.site.com)、(.www.site.com)域中cookie的值。
注:Cookie儲存在.site.com site.com中是兩種概念,所有儲存域是以 . (英文點) 開始的,標示是開放域,儲存在這樣域下的Cookie,是可以在當前域下的所有子域,孫域,都可以讀取,非開放域(不是以英文點開始的儲存域),只能在當前域中讀取到。同級域無法共通(也就是在s1.site.com網頁,無法讀取到.www.site.com儲存的Cookie)