日炒現(xiàn)象
- 登錄了某個(gè)網(wǎng)站,過(guò)一會(huì)兒再登錄转砖,誒须鼎,不用輸入密碼了,直接是登錄狀態(tài)了府蔗,好神奇~~~
- 在某網(wǎng)站看了一部手機(jī)晋控,接下來(lái)瀏覽其他網(wǎng)站,旁邊的廣告全是手機(jī)和類似信息礁竞,好恐怖~~~
- 瀏覽某網(wǎng)站時(shí)糖荒,提示我是第66666位訪問(wèn)的客戶,真的假的模捂?
其實(shí)這些都是Cookie和Session在后面作祟
捶朵,下面就帶大家學(xué)習(xí)學(xué)習(xí)這兩個(gè)東東。
Cookie和Session的異同
- Cookie與Session都是用來(lái)保存用戶狀態(tài)信息的一種方法或者手段狂男;
- Cookie是保存在客戶端的臨時(shí)文件夾综看, Session是保存在服務(wù)器的內(nèi)存中的,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)來(lái)保存信息岖食,一個(gè)Session域?qū)ο鬄橐粋€(gè)客戶瀏覽器服務(wù)红碑;
- Cookie安全性較差,Session安全性較高泡垃;
- Cookie的保存時(shí)間可以很久(以txt格式保存在客戶端硬盤(pán))析珊,Session保存的時(shí)間很短,一般是30分鐘蔑穴;
- Cookie為多個(gè)客戶瀏覽器共享忠寻,Session為一個(gè)客戶瀏覽器獨(dú)享;
- Session是通過(guò)Cookie的機(jī)制來(lái)實(shí)現(xiàn)的存和。
兩個(gè)經(jīng)典問(wèn)題與URL重寫(xiě)
1奕剃、客戶端禁用Cookie,問(wèn)Session還能工作嗎捐腿?
- 不能(事實(shí))絕大多數(shù)的網(wǎng)站是這樣纵朋,原因是沒(méi)有使用URL重寫(xiě)機(jī)制來(lái)解決Cookie被禁用的問(wèn)題。(URL重寫(xiě)代碼量大而且只能應(yīng)用在動(dòng)態(tài)的頁(yè)面靜態(tài)的不行)
- 能(事實(shí))微乎其微的網(wǎng)站可以(比如:卓越)茄袖,原因是它使用了URL重寫(xiě)機(jī)制操软。
2、 Cookie可以用來(lái)實(shí)現(xiàn)購(gòu)物車功能嗎宪祥?
能寺鸥,Session能做的Cookie也能做猪钮。
** 本質(zhì) **
無(wú)論Cookie,還是URL重寫(xiě)胆建,目的都是向服務(wù)器傳遞JSESSIONID=32位字符串的key和value名值對(duì)烤低。
理解Cookie-Session機(jī)制
當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)Session的時(shí)候,服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否已包含了一個(gè)Session標(biāo)識(shí)——稱為 Session id笆载,如果已包含一個(gè)Session id則說(shuō)明以前已經(jīng)為此客戶端創(chuàng)建過(guò)Session扑馁,服務(wù)器就按照Session id把這個(gè) Session檢索出來(lái)使用。如果客戶端請(qǐng)求不包含Session id凉驻,則為此客戶端創(chuàng)建一個(gè)Session并且生成一個(gè)與此Session相關(guān)聯(lián)的Session id腻要,這個(gè) Session id將在本次響應(yīng)中返回給客戶端保存±缘牵客戶端保存這個(gè)Session id的方式可以采用Cookie雄家,這樣在交互過(guò)程中瀏覽器可以自動(dòng)的按照規(guī)則把這個(gè)標(biāo)識(shí)發(fā)回給服務(wù)器。一般這個(gè)Cookie的名字都是類似于JSESSIONID胀滚。對(duì)Session來(lái)說(shuō)趟济,除非應(yīng)用程序通知服務(wù)器刪除一個(gè)Session,否則服務(wù)器會(huì)一直保留它咽笼。瀏覽器從來(lái)不會(huì)主動(dòng)在關(guān)閉之前通知服務(wù)器它將要關(guān)閉顷编,因此服務(wù)器不會(huì)知道瀏覽器已經(jīng)關(guān)閉。之所以會(huì)有這種錯(cuò)覺(jué)剑刑,是大部分Session機(jī)制都使用會(huì)話Cookie來(lái)保存Session id媳纬,而關(guān)閉瀏覽器后這個(gè) Session id就消失了,再次連接服務(wù)器時(shí)也就無(wú)法找到原來(lái)的Session施掏。如果服務(wù)器設(shè)置的Cookie被保存到硬盤(pán)上钮惠,或者使用某種手段改寫(xiě)瀏覽器發(fā)出的HTTP請(qǐng)求頭,把原來(lái)的Session id發(fā)送給服務(wù)器七芭,則再次打開(kāi)瀏覽器仍然能夠找到原來(lái)的Session素挽。也就實(shí)說(shuō)關(guān)閉瀏覽器不會(huì)導(dǎo)致服務(wù)器端Session被刪除,但是大量的Session一直在也服務(wù)器內(nèi)存抖苦,服務(wù)器也受不了,所以服務(wù)器為Session設(shè)置了一個(gè)失效時(shí)間米死,當(dāng)距離客戶端上一次使用Session的時(shí)間超過(guò)這個(gè)失效時(shí)間(一般為30分鐘)時(shí)锌历,服務(wù)器就可以認(rèn)為客戶端已經(jīng)停止了活動(dòng),才會(huì)把Session刪除以節(jié)省服務(wù)器端的存儲(chǔ)空間峦筒。