1. 程式人生 > >js讀寫Cookie問題(Cookie儲存時長、Cookie儲存域)彙總

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)