Web應(yīng)用程序是使用HTTP協(xié)議傳輸完成的。HTTP協(xié)議是無(wú)狀態(tài)的協(xié)議。當(dāng)數(shù)據(jù)交換完畢以后,客戶端與服務(wù)器端的連接就會(huì)關(guān)閉。當(dāng)再次交換數(shù)據(jù)的時(shí)候需要重新建立新的連接。這就意味著服務(wù)器無(wú)法從連接上跟蹤會(huì)話。
大家應(yīng)該都有這樣的經(jīng)歷,當(dāng)你登錄一個(gè)網(wǎng)站的時(shí)候會(huì)提醒你要不要記住賬戶和密碼,這樣下次來(lái)你就不用再次輸入賬號(hào)和密碼了。這就是Cookie的作用,當(dāng)我們?cè)俅卧L問的時(shí)候,方便服務(wù)器直接根據(jù)我們的Cookie直接來(lái)取上一次我們?nèi)∵^(guò)的東西(對(duì)于每一個(gè)Cookie服務(wù)器會(huì)對(duì)這個(gè)Cookie存儲(chǔ)上一次我們拿過(guò)的數(shù)據(jù),下一次對(duì)于同一個(gè)Cookie的時(shí)候,就直接取了)
什么是Cookie?
Cookie是由服務(wù)器端生成的,發(fā)送給User-Agent(一般是瀏覽器),這個(gè)時(shí)候服務(wù)器會(huì)告訴瀏覽器要設(shè)置一下Cookie,瀏覽器自動(dòng)將Cookie以Key/Value(鍵值對(duì))的方式保存在某個(gè)目錄下的文本文件內(nèi),下次請(qǐng)求同一個(gè)網(wǎng)站時(shí)也會(huì)自動(dòng)發(fā)送該Cookie給服務(wù)器,即添加在請(qǐng)求頭部(但是前提時(shí)瀏覽器設(shè)置為啟用Cookie)
Cookie就是一個(gè)小型文件(瀏覽器對(duì)Cookie的內(nèi)存大小是有限制的,Cookie的大小一般是4K---用來(lái)記錄一些信息)
Cookie具有保質(zhì)期
Cookie即有永久的也含有臨時(shí)的,每一個(gè)瀏覽器都含有自己的Cookie,每次請(qǐng)求的時(shí)候,都會(huì)根據(jù)domain來(lái)發(fā)送響應(yīng)的Cookie,也可以通過(guò)設(shè)置expires 、max-age來(lái)設(shè)定保存日期,不設(shè)置的話默認(rèn)是臨時(shí)存儲(chǔ),即關(guān)閉瀏覽器就消失。
document.cookie='expires=時(shí)間/max-age=秒'
Cookie的安全性
Cookie在本地可以被更改文件 敏感的數(shù)據(jù)不要放在Cookie里。
如何設(shè)置 cookie?
知道了cookie的格式,cookie的屬性選項(xiàng),接下來(lái)我們就可以設(shè)置cookie了。首先得明確一點(diǎn):cookie既可以由服務(wù)端來(lái)設(shè)置,也可以由客戶端來(lái)設(shè)置。
服務(wù)端設(shè)置 cookie
不管你是請(qǐng)求一個(gè)資源文件(如 html/js/css/圖片),還是發(fā)送一個(gè)ajax請(qǐng)求,服務(wù)端都會(huì)返回response。而response header中有一項(xiàng)叫set-cookie,是服務(wù)端專門用來(lái)設(shè)置cookie的。如下圖所示,服務(wù)端返回的response header中有5個(gè)set-cookie字段,每個(gè)字段對(duì)應(yīng)一個(gè)cookie(注意不能將多個(gè)cookie放在一個(gè)set-cookie字段中),set-cookie字段的值就是普通的字符串,每個(gè)cookie還設(shè)置了相關(guān)屬性選項(xiàng)。
注意:
一個(gè)set-Cookie字段只能設(shè)置一個(gè)cookie,當(dāng)你要想設(shè)置多個(gè) cookie,需要添加同樣多的set-Cookie字段。
服務(wù)端可以設(shè)置cookie 的所有選項(xiàng):expires、domain、path、secure、HttpOnly
客戶端設(shè)置 cookie
在網(wǎng)頁(yè)即客戶端中我們也可以通過(guò)js代碼來(lái)設(shè)置cookie。如我當(dāng)前打開的網(wǎng)址為http://dxw.st.sankuai.com/mp/,在控制臺(tái)中我們執(zhí)行了下面代碼:
document.cookie = "name=Jonh; ";
再執(zhí)行下面代碼:
document.cookie="age=12; expires=Thu, 26 Feb 2116 11:50:25 GMT; domain=sankuai.com; path=/";
查看瀏覽器cookie 面板,如下圖所示,新的cookie設(shè)置成功了,而且屬性選項(xiàng) domain、path、expires都變成了設(shè)定的值。
注意:
客戶端可以設(shè)置cookie 的下列選項(xiàng):expires、domain、path、secure(有條件:只有在https協(xié)議的網(wǎng)頁(yè)中,客戶端設(shè)置secure類型的 cookie 才能成功),但無(wú)法設(shè)置HttpOnly選項(xiàng)。
用 js 如何設(shè)置多個(gè) cookie
當(dāng)要設(shè)置多個(gè)cookie時(shí), js 代碼很自然地我們會(huì)這么寫:
document.cookie = "name=Jonh; age=12; class=111";
但你會(huì)發(fā)現(xiàn)這樣寫只是添加了第一個(gè)cookie“name=John”,后面的所有cookie都沒有添加成功。所以最簡(jiǎn)單的設(shè)置多個(gè)cookie的方法就在重復(fù)執(zhí)行document.cookie = "key=name",如下:
document.cookie = "name=Jonh";
document.cookie = "age=12";
document.cookie = "class=111“,
如何修改、刪除
修改 cookie
要想修改一個(gè)cookie,只需要重新賦值就行,舊的值會(huì)被新的值覆蓋。但要注意一點(diǎn),在設(shè)置新cookie時(shí),path/domain這幾個(gè)選項(xiàng)一定要舊cookie 保持一樣。否則不會(huì)修改舊值,而是添加了一個(gè)新的 cookie。
刪除 cookie
刪除一個(gè)cookie 也挺簡(jiǎn)單,也是重新賦值,只要將這個(gè)新cookie的expires 選項(xiàng)設(shè)置為一個(gè)過(guò)去的時(shí)間點(diǎn)就行了。但同樣要注意,path/domain/這幾個(gè)選項(xiàng)一定要舊cookie 保持一樣。