Cookie就是這樣的一種機制。它可以彌補HTTP協定無狀態的不足。在Session出現之前,基本上所有的網站都採用Cookie來追蹤會話。以下透過本文為大家介紹JS中cookie的使用及缺點,需要的朋友參考下吧
# 什麼是Cookie
##Cookie意為“甜餅”,是由W3C組織提出,最早由Netscape社群發展的機制。目前Cookie已成為標準,所有的主流瀏覽器如IE、Netscape、Firefox、Opera等都支援Cookie。 由於HTTP是無狀態的協議,伺服器單從網路連線上無從知道客戶身分。怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,無論誰訪問都必須攜帶自己通行證。這樣伺服器就能從通行證上確認客戶身分了。這就是Cookie的工作原理。 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的名中做到這一點很容易,但要保存的值是不確定的。如何來儲存這些值呢?方法是用escape()
函數進行編碼,它能將一些特殊符號使用十六進位表示,例如空格將會編碼為“20%”,從而可以存儲在cookie值中,而且使用此種方案還可以避免中文亂碼的出現。
document.cookie="str="+escape("I love ajax"); // document.cookie="str=I%20love%20ajax";當使用escape()編碼後,在取出值以後需要使用unescape()進行解碼才能得到原來的cookie值,
JS讀取cookie:
假設cookie中儲存的內容為:name=jack;password=123
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個cookie1.IE6或更低版本最多20個cookie
2.IE7和之後的版本最後可以有50個cookie。 3.Firefox最多50個cookie4.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.有些狀態不可能保存在客戶端。例如,為了防止重複提交表單,我們需要在伺服器端保存一個計數器。如果我們把這個計數器保存在客戶端,那麼它就起不到任何作用。
【相關推薦】
1. 特別推薦:「php程式設計師工具箱」V0.1版本下載
2. 免費js線上影片教學
3. php.cn獨孤九賤(3)-JavaScript影片教學
#以上是JS中cookie的使用方法及缺點介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!