js中cookie的使用 以及缺點

 

  什麼是Cookie

Cookie意爲「甜餅」,是W3C組織提出,最先由Netscape社區發展的一種機制。目前Cookie已經成爲標準,全部的主流瀏覽器如IE、Netscape、Firefox、Opera等都支持Cookie。ajax

因爲HTTP是一種無狀態的協議,服務器單從網絡鏈接上無從知道客戶身份。怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,不管誰訪問都必須攜帶本身通行證。這樣服務器就能從通行證上確認客戶身份了。這就是Cookie的工做原理chrome

Cookie其實是一小段的文本信息。客戶端請求服務器,若是服務器須要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。服務器還能夠根據須要修改Cookie的內容。編程

 

 

 Cookie機制

在程序中,會話跟蹤是很重要的事情。理論上,一個用戶的全部請求操做都應該屬於同一個會話,而另外一個用戶的全部請求操做則應該屬於另外一個會話,兩者不能混淆。例如,用戶A在超市購買的任何商品都應該放在A的購物車內,不管是用戶A什麼時間購買的,這都是屬於同一個會話的,不能放入用戶B或用戶C的購物車內,這不屬於同一個會話。瀏覽器

而Web應用程序是使用HTTP協議傳輸數據的。HTTP協議是無狀態的協議。一旦數據交換完畢,客戶端與服務器端的鏈接就會關閉,再次交換數據須要創建新的鏈接。這就意味着服務器沒法從鏈接上跟蹤會話。即用戶A購買了一件商品放入購物車內,當再次購買商品時服務器已經沒法判斷該購買行爲是屬於用戶A的會話仍是用戶B的會話了。要跟蹤該會話,必須引入一種機制。緩存

Cookie就是這樣的一種機制。它能夠彌補HTTP協議無狀態的不足。在Session出現以前,基本上全部的網站都採用Cookie來跟蹤會話。安全

 

 

JS設置cookie:

假設在A頁面中要保存變量username的值("jack")到cookie中,key值爲name,則相應的JS代碼爲:服務器

 

 

document.cookie="name="+username;cookie

 

 

在cookie 的名或值中不能使用分號(;)、逗號(,)、等號(=)以及空格。在cookie的名中作到這點很容易,但要保存的值是不肯定的。如何來存儲這些值呢?方 法是用escape()函數進行編碼,它能將一些特殊符號使用十六進制表示,例如空格將會編碼爲「20%」,從而能夠存儲於cookie值中,並且使用此 種方案還能夠避免中文亂碼的出現。網絡

document.cookie="str="+escape("I love ajax");  session

// document.cookie="str=I%20love%20ajax"; 

 

當使用escape()編碼後,在取出值之後須要使用unescape()進行解碼才能獲得原來的cookie值,

JS讀取cookie:

假設cookie中存儲的內容爲:name=jack;password=123

則在B頁面中獲取變量username的值的JS代碼以下:

var username=document.cookie.split(";")[0].split("=")[1];

//JS操做cookies方法!

//寫cookies

function setCookie(name,value)

{

var Days = 30;

var exp = new Date();

exp.setTime(exp.getTime() + Days*24*60*60*1000);

document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();

}

讀取cookies

 

function getCookie(name)

{

var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");

if(arr=document.cookie.match(reg))

return unescape(arr[2]);

else

return null;

}

 

刪除cookies

function delCookie(name)

{

var exp = new Date();

exp.setTime(exp.getTime() - 1);

var cval=getCookie(name);

if(cval!=null)

document.cookie= name + "="+cval+";expires="+exp.toGMTString();

}

//使用示例

setCookie("name","hayden");

alert(getCookie("name"));

//若是須要設定自定義過時時間

//那麼把上面的setCookie 函數換成下面兩個函數就ok;

//程序代碼

function setCookie(name,value,time)

{

var strsec = getsec(time);

var exp = new Date();

exp.setTime(exp.getTime() + strsec*1);

document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();

}

function getsec(str)

{

alert(str);

var str1=str.substring(1,str.length)*1;

var str2=str.substring(0,1);

if (str2=="s")

{

return str1*1000;

}

else if (str2=="h")

{

return str1*60*60*1000;

}

else if (str2=="d")

{

return str1*24*60*60*1000;

}

}

//這是有設定過時時間的使用示例:

//s20是表明20秒

//h是指小時,如12小時則是:h12

//d是天數,30天則:d30

setCookie("name","hayden","s20");

 

 

 

Cookie缺點

 

cookie雖然在持久保存客戶端數據提供了方便,分擔了服務器存儲的負擔,但仍是有不少侷限性的。

第一:每一個特定的域名下最多生成20個cookie

 

1.IE6或更低版本最多20個cookie

2.IE7和以後的版本最後能夠有50個cookie。

3.Firefox最多50個cookie

4.chrome和Safari沒有作硬性限制

IE和Opera 會清理近期最少使用的cookie,Firefox會隨機清理cookie。

 

cookie的最大大約爲4096字節,爲了兼容性,通常不能超過4095字節。

 

IE 提供了一種存儲能夠持久化用戶數據,叫作uerData,從IE5.0就開始支持。每一個數據最多128K,每一個域名下最多1M。這個持久化數據放在緩存中,若是緩存沒有清理,那麼會一直存在。

 

優勢:極高的擴展性和可用性

 

1.經過良好的編程,控制保存在cookie中的session對象的大小。

2.經過加密和安全傳輸技術(SSL),減小cookie被破解的可能性。

3.只在cookie中存放不敏感數據,即便被盜也不會有重大損失。

4.控制cookie的生命期,使之不會永遠有效。偷盜者極可能拿到一個過時的cookie。

 

缺點:

1.`Cookie`數量和長度的限制。每一個domain最多隻能有20條cookie,每一個cookie長度不能超過4KB,不然會被截掉。

 

2.安全性問題。若是cookie被人攔截了,那人就能夠取得全部的session信息。即便加密也與事無補,由於攔截者並不須要知道cookie的意義,他只要原樣轉發cookie就能夠達到目的了。

 

3.有些狀態不可能保存在客戶端。例如,爲了防止重複提交表單,咱們須要在服務器端保存一個計數器。若是咱們把這個計數器保存在客戶端,那麼它起不到任何做用。

相關文章
相關標籤/搜索