js讀寫Cookie問題(Cookie存儲時長、Cookie存儲域)匯總


在采集網站用戶行為數據/使用js對用戶行為做交互時,經常會使用到Cookie,了解Js Cookie的讀寫,以及一些細節,非常重要。
 
什么是Cookie
所謂Cookie,只是一條極為短小的信息,它被瀏覽器自動地放置在訪問用戶的電腦硬盤中。
例如:C:\Users\[user]\AppData\Roaming\Microsoft\Windows\Cookies 
 

 

 
 如上圖所示,打開的一個文件里面,標示了一個域下多個Cookie的信息。
 
 
檢測/判斷瀏覽器是否支持Cookie
在絕大多數瀏覽器中,可以通過檢測 navigator.cookieEnabled這個屬性來實現,若該值為true,則當前Cookie功能是開啟的。
 
Cookie屬性
Cookie比較重要的幾個屬性
Cookie名(name),Cookie值(value),存儲域(domain),存儲路徑(path),Cookie有效期(max-age/expires),secure屬性(一般不常用)
 
Cookie值(value) 最好經過encodeURIComponent編碼,否則可能會出現不同瀏覽器處理不同的異常或者直接報錯。
 
注:HttpOnly屬性其他語言(Java)設置的Cookie的一個屬性,設置該屬性的Cookie,js是無法讀取的。
max-age:設置在多久后過期;
expires:設置一個過期的時間點;
 
上述屬性中默認字段
 
 
 
js寫Cookie 
document.cookie='cookie_name=cookie_value;path=/;domain='+'.site.cn;max-age=Session;'  //一般寫法,此處的.site.cn需要換成你js執行的網頁的域名
寫Cookie方法 
function setCookie(name,value,domain,path,day){
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在瀏覽器中的(使用F12查看Cookie)Cookies中就能看到所有的Cookie。
但是請注意,Cookies和Cookie是有區別的,Cookies是代表多個獨立唯一的Cookie的集合。
Cookie指的是,唯一獨立的一條Cookie的信息。我們修改、刪除該Cookie是不會對其他Cookie產生任何影響。
 
唯一的Cookie指的是,在Cookie名稱、Cookie存儲域,Cookie存儲路徑,這三個屬性中,任意一個屬性不同,就標示一個獨立的Cookie,都是唯一的Cookie。

 

 
 
 
什么是第一方Cookie,第三方Cookie
所謂第一方Cookie,和第三方Cookie,這是一個相對定義。
第一方Cookie:存儲在(domain值為),當前域  或 當前子域  或 當前父域下的Cookie,統稱為第一方Cookie;
第三方Cookie:存儲在(domain值為),不是當前域  且 不是當前域的子域  且 不是當前父域下的Cookie,統稱為第一方Cookie;
 
例如:我在新浪首頁,看Cookie的時候,發現了其他非新浪域名下的Cookie,如京東的Cookie,那么此時  第一方Cookie是存儲域名是新浪下面的 (.sina.com.cn,www.sina.com.cn以及sina.com.cn的子域)域,第三方Cookie是存儲域名為(.jd.com , .taobao.com等)非新浪域名以及子域的Cookie的統稱。
 
例如:我在京東首頁,看Cookie的時候,發現了其他非京東域名下的Cookie,如新浪的Cookie,那么此時  第一方Cookie是存儲域名是新浪下面的 (.jd.com,www.jd.com以及jd.com的子域)域,第三方Cookie是存儲域名為(.baidu.com , .google.com等非)京東域名以及子域的Cookie的統稱。
 
 
js讀Cookie
讀Cookie方法
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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM