JS中cookie的使用及缺點(diǎn)講解
什么是Cookie
Cookie意為“甜餅”,是由W3C組織提出,最早由Netscape社區(qū)發(fā)展的一種機(jī)制。目前Cookie已經(jīng)成為標(biāo)準(zhǔn),所有的主流瀏覽器如IE、Netscape、Firefox、Opera等都支持Cookie。
由于HTTP是一種無(wú)狀態(tài)的協(xié)議,服務(wù)器單從網(wǎng)絡(luò)連接上無(wú)從知道客戶身份。怎么辦呢?就給客戶端們頒發(fā)一個(gè)通行證吧,每人一個(gè),無(wú)論誰(shuí)訪問(wèn)都必須攜帶自己通行證。這樣服務(wù)器就能從通行證上確認(rèn)客戶身份了。這就是Cookie的工作原理。
Cookie實(shí)際上是一小段的文本信息??蛻舳苏?qǐng)求服務(wù)器,如果服務(wù)器需要記錄該用戶狀態(tài),就使用response向客戶端瀏覽器頒發(fā)一個(gè)Cookie??蛻舳藶g覽器會(huì)把Cookie保存起來(lái)。當(dāng)瀏覽器再請(qǐng)求該網(wǎng)站時(shí),瀏覽器把請(qǐng)求的網(wǎng)址連同該Cookie一同提交給服務(wù)器。服務(wù)器檢查該Cookie,以此來(lái)辨認(rèn)用戶狀態(tài)。服務(wù)器還可以根據(jù)需要修改Cookie的內(nèi)容。
Cookie機(jī)制
在程序中,會(huì)話跟蹤是很重要的事情。理論上,一個(gè)用戶的所有請(qǐng)求操作都應(yīng)該屬于同一個(gè)會(huì)話,而另一個(gè)用戶的所有請(qǐng)求操作則應(yīng)該屬于另一個(gè)會(huì)話,二者不能混淆。例如,用戶A在超市購(gòu)買的任何商品都應(yīng)該放在A的購(gòu)物車內(nèi),不論是用戶A什么時(shí)間購(gòu)買的,這都是屬于同一個(gè)會(huì)話的,不能放入用戶B或用戶C的購(gòu)物車內(nèi),這不屬于同一個(gè)會(huì)話。
而Web應(yīng)用程序是使用HTTP協(xié)議傳輸數(shù)據(jù)的。HTTP協(xié)議是無(wú)狀態(tài)的協(xié)議。一旦數(shù)據(jù)交換完畢,客戶端與服務(wù)器端的連接就會(huì)關(guān)閉,再次交換數(shù)據(jù)需要建立新的連接。這就意味著服務(wù)器無(wú)法從連接上跟蹤會(huì)話。即用戶A購(gòu)買了一件商品放入購(gòu)物車內(nèi),當(dāng)再次購(gòu)買商品時(shí)服務(wù)器已經(jīng)無(wú)法判斷該購(gòu)買行為是屬于用戶A的會(huì)話還是用戶B的會(huì)話了。要跟蹤該會(huì)話,必須引入一種機(jī)制。
Cookie就是這樣的一種機(jī)制。它可以彌補(bǔ)HTTP協(xié)議無(wú)狀態(tài)的不足。在Session出現(xiàn)之前,基本上所有的網(wǎng)站都采用Cookie來(lái)跟蹤會(huì)話。
JS設(shè)置cookie:
假設(shè)在A頁(yè)面中要保存變量username的值("jack")到cookie中,key值為name,則相應(yīng)的JS代碼為:
document.cookie="name="+username;
在cookie 的名或值中不能使用分號(hào)(;)、逗號(hào)(,)、等號(hào)(=)以及空格。在cookie的名中做到這點(diǎn)很容易,但要保存的值是不確定的。如何來(lái)存儲(chǔ)這些值呢?方 法是用escape()函數(shù)進(jìn)行編碼,它能將一些特殊符號(hào)使用十六進(jìn)制表示,例如空格將會(huì)編碼為“20%”,從而可以存儲(chǔ)于cookie值中,而且使用此 種方案還可以避免中文亂碼的出現(xiàn)。
document.cookie="str="+escape("I love ajax"); // document.cookie="str=I%20love%20ajax";
當(dāng)使用escape()編碼后,在取出值以后需要使用unescape()進(jìn)行解碼才能得到原來(lái)的cookie值,
JS讀取cookie:
假設(shè)cookie中存儲(chǔ)的內(nèi)容為:name=jack;password=123
則在B頁(yè)面中獲取變量username的值的JS代碼如下:
var username=document.cookie.split(";")[0].split("=")[1]; //JS操作cookies方法! //寫(xiě)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")); //如果需要設(shè)定自定義過(guò)期時(shí)間 //那么把上面的setCookie 函數(shù)換成下面兩個(gè)函數(shù)就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; } } //這是有設(shè)定過(guò)期時(shí)間的使用示例: //s20是代表20秒 //h是指小時(shí),如12小時(shí)則是:h12 //d是天數(shù),30天則:d30 setCookie("name","hayden","s20");
Cookie缺點(diǎn)
cookie雖然在持久保存客戶端數(shù)據(jù)提供了方便,分擔(dān)了服務(wù)器存儲(chǔ)的負(fù)擔(dān),但還是有很多局限性的。
第一:每個(gè)特定的域名下最多生成20個(gè)cookie
1.IE6或更低版本最多20個(gè)cookie
2.IE7和之后的版本最后可以有50個(gè)cookie。
3.Firefox最多50個(gè)cookie
4.chrome和Safari沒(méi)有做硬性限制
IE和Opera 會(huì)清理近期最少使用的cookie,F(xiàn)irefox會(huì)隨機(jī)清理cookie。
cookie的最大大約為4096字節(jié),為了兼容性,一般不能超過(guò)4095字節(jié)。
IE 提供了一種存儲(chǔ)可以持久化用戶數(shù)據(jù),叫做uerData,從IE5.0就開(kāi)始支持。每個(gè)數(shù)據(jù)最多128K,每個(gè)域名下最多1M。這個(gè)持久化數(shù)據(jù)放在緩存中,如果緩存沒(méi)有清理,那么會(huì)一直存在。
優(yōu)點(diǎn):極高的擴(kuò)展性和可用性
1.通過(guò)良好的編程,控制保存在cookie中的session對(duì)象的大小。
2.通過(guò)加密和安全傳輸技術(shù)(SSL),減少cookie被破解的可能性。
3.只在cookie中存放不敏感數(shù)據(jù),即使被盜也不會(huì)有重大損失。
4.控制cookie的生命期,使之不會(huì)永遠(yuǎn)有效。偷盜者很可能拿到一個(gè)過(guò)期的cookie。
缺點(diǎn):
1.`Cookie`數(shù)量和長(zhǎng)度的限制。每個(gè)domain最多只能有20條cookie,每個(gè)cookie長(zhǎng)度不能超過(guò)4KB,否則會(huì)被截掉。
2.安全性問(wèn)題。如果cookie被人攔截了,那人就可以取得所有的session信息。即使加密也與事無(wú)補(bǔ),因?yàn)閿r截者并不需要知道cookie的意義,他只要原樣轉(zhuǎn)發(fā)cookie就可以達(dá)到目的了。
3.有些狀態(tài)不可能保存在客戶端。例如,為了防止重復(fù)提交表單,我們需要在服務(wù)器端保存一個(gè)計(jì)數(shù)器。如果我們把這個(gè)計(jì)數(shù)器保存在客戶端,那么它起不到任何作用。
以上所述是小編給大家介紹的JS中cookie的使用及缺點(diǎn)講解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
javascript實(shí)現(xiàn)數(shù)組扁平化六種技巧總結(jié)
這篇文章主要為大家詳細(xì)介紹了六種javascript中實(shí)現(xiàn)數(shù)組扁平化的技巧,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解下2023-12-12原生JavaScript實(shí)現(xiàn)動(dòng)態(tài)省市縣三級(jí)聯(lián)動(dòng)下拉框菜單實(shí)例代碼
像平時(shí)購(gòu)物選擇地址時(shí)一樣,通過(guò)選擇的省動(dòng)態(tài)加載城市列表,通過(guò)選擇的城市動(dòng)態(tài)加載縣區(qū)列表,從而可以實(shí)現(xiàn)省市縣的三級(jí)聯(lián)動(dòng),下面使用原生的JavaScript來(lái)實(shí)現(xiàn)這個(gè)功能,需要的朋友參考下吧2016-02-02JS實(shí)現(xiàn)點(diǎn)擊Radio動(dòng)態(tài)更新table數(shù)據(jù)
這篇文章主要介紹了JS實(shí)現(xiàn)點(diǎn)擊Radio動(dòng)態(tài)更新table數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2017-07-07詳解如何準(zhǔn)確判斷JavaScript中的數(shù)據(jù)類型
JavaScript中,我們經(jīng)常需要判斷數(shù)據(jù)類型以便于正確地處理數(shù)據(jù),本文將介紹JavaScript中的數(shù)據(jù)類型判斷技術(shù),包括typeof操作符、instanceof操作符、Object.prototype.toString方法以及ES6新增的一些數(shù)據(jù)類型判斷方法,需要的朋友可以參考下2023-08-08JS 實(shí)現(xiàn)雙色表格實(shí)現(xiàn)代碼
通過(guò)為<tr>元素添加屬性或類型選擇器,再通過(guò)CSS設(shè)置可以實(shí)現(xiàn)雙色表格,但如果表格很長(zhǎng),逐個(gè)元素添加可真麻煩。而且這樣的代碼維護(hù)起來(lái)不容易。所以比較好的方式是用JS實(shí)現(xiàn)。2009-11-11JS與jQuery遍歷Table所有單元格內(nèi)容的方法
這篇文章主要介紹了JS與jQuery遍歷Table所有單元格內(nèi)容的方法,結(jié)合實(shí)例形式分別描述了JavaScript與jQuery實(shí)現(xiàn)遍歷table單元格的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12javascript DIV實(shí)現(xiàn)跟隨鼠標(biāo)移動(dòng)
這篇文章主要為大家詳細(xì)介紹了javascript DIV跟隨鼠標(biāo)移動(dòng),有一個(gè)div跟隨鼠標(biāo)移動(dòng)的結(jié)果,有一連串跟隨鼠標(biāo)移動(dòng)的效果,感興趣的小伙伴們可以參考一下2016-02-02