Session 和Cookie 機(jī)制

Session生命周期已經(jīng)Cookie的區(qū)別

簡(jiǎn)述:
會(huì)話(Session)<C醒> 用來跟蹤用戶的整個(gè)回話

Cookie<哭虧>

Cookie 機(jī)制:
理論上,一個(gè)用戶的所有請(qǐng)求操作都應(yīng)該屬于同一個(gè)會(huì)話,而另一個(gè)用戶的所有請(qǐng)求操作則應(yīng)該屬于另一個(gè)會(huì)話,二者不能混淆.
例如:
用戶A在超市買的任何商品,都應(yīng)該是放入A的購(gòu)物車中!
不論用戶A 是什么時(shí)間買的!
這都屬于同一個(gè)會(huì)話.
不可能你的買的東西,我來付錢,最后的東西還不在我的手上吧!

而HTTP協(xié)議:是一種無狀態(tài)的協(xié)議
(無狀態(tài)就是:對(duì)于你之前的操作,處理,沒有記憶能力)
一旦客戶端和服務(wù)端數(shù)據(jù)交換完畢,客戶端和服務(wù)端的連接就斷開了.再次進(jìn)行數(shù)據(jù)交互的時(shí)候,就需要重新建立連接.這就意味著,服務(wù)器無法從連接上同步用戶的操作了!

就是用戶A 把商品放入購(gòu)物 是客戶端和服務(wù)端的一次數(shù)據(jù)交換
然后用戶A結(jié)賬的時(shí)候,又是一次數(shù)據(jù)交換!
而在用戶進(jìn)行第二次數(shù)據(jù)交換的時(shí)候,服務(wù)端無法判斷那個(gè)商品屬于A!

所以要讓服務(wù)器端跟蹤(同步)用戶的操作,就必須引入一種機(jī)制.
而這種機(jī)制就是Cookie

? 由于HTTP是一種無狀態(tài)的協(xié)議,服務(wù)器無法在網(wǎng)絡(luò)連接上知道用戶的身份.怎么辦?
這個(gè)時(shí)候,就給每一個(gè)客戶端發(fā)一個(gè)令牌!,每人一個(gè).無論是誰訪問都得帶上它,而這樣服務(wù)器就能從令牌上確認(rèn)用戶身份了.
這就是Cookie的工作原理?
Cookie實(shí)際上是一小段的文本信息??蛻舳苏?qǐng)求服務(wù)器,如果服務(wù)器需要記錄該用戶狀態(tài),就使用response向客戶端瀏覽器頒發(fā)一個(gè)Cookie??蛻舳藶g覽器會(huì)把Cookie保存起來。當(dāng)瀏覽器再請(qǐng)求該網(wǎng)站時(shí),瀏覽器把請(qǐng)求的網(wǎng)址連同該Cookie一同提交給服務(wù)器。服務(wù)器檢查該Cookie,以此來辨認(rèn)用戶狀態(tài)。



Session是另一種記錄客戶狀態(tài)的機(jī)制,不同的是Cookie保存在客戶端瀏覽器中,而Session保存在服務(wù)器上。





? Session 機(jī)制?
Session是服務(wù)器端使用的一種記錄客戶端狀態(tài)的機(jī)制,使用上比Cookie簡(jiǎn)單一些,相應(yīng)的也增加了服務(wù)器的存儲(chǔ)壓力。

客戶端瀏覽器訪問服務(wù)器的時(shí)候,服務(wù)器把客戶端信息以某種形式記錄在服務(wù)器上。這就是Session

客戶端瀏覽器再次訪問時(shí)只需要從該Session中查找該客戶的狀態(tài)就可以了。

如果說Cookie機(jī)制是通過檢查客戶身上的“令牌”來確定客戶身份的話.那么Session機(jī)制就是通過檢查服務(wù)器上的 "身份證檔案"就確認(rèn)用戶的身份


Session相當(dāng)于程序在服務(wù)器上建立的一份客戶檔案,客戶來訪的時(shí)候只需要查詢客戶檔案表就可以了。





? 說一下Session的生命周期
為了獲得更高的存取速度,服務(wù)器一般把Session放在內(nèi)存里。每個(gè)用戶都會(huì)有一個(gè)獨(dú)立的Session。如果Session內(nèi)容過于復(fù)雜,當(dāng)大量客戶訪問服務(wù)器時(shí)可能會(huì)導(dǎo)致內(nèi)存溢出
    
    
    
Session在用戶第一次訪問服務(wù)器的時(shí)候自動(dòng)創(chuàng)建。需要注意只有訪問JSP、Servlet等程序時(shí)才會(huì)創(chuàng)建Session

如果尚未生成Session,也可以使用request.getSession(true)強(qiáng)制生成Session

Session生成后,只要用戶繼續(xù)訪問,服務(wù)器就會(huì)更新Session的最后訪問時(shí)間


如果用戶過多,那么Session也會(huì)多
為防止內(nèi)存溢出,是不是服務(wù)器就得把長(zhǎng)時(shí)間沒有訪問過服務(wù)器的,Sesion給刪除了。
Session的有效時(shí)間設(shè)置:
通過Session的屬性,
maxInactiveInterval(馬克思應(yīng)來特應(yīng)賭博)
Session的有效時(shí)間可以在web.xml中修改
Session的invalidate()方法可以使Session失效。


剛才也說了,Session是存在服務(wù)器的內(nèi)存中的,
如果改變服務(wù)器,那么Session就沒有了






雖然Session保存在服務(wù)器,對(duì)客戶端是透明的,它的正常運(yùn)行仍然需要客戶端瀏覽器的支持。
因?yàn)镾ession需要使用Cookie作為識(shí)別標(biāo)志。


Session不能依據(jù)HTTP連接來判斷是否為同一客戶,因此服務(wù)器向客戶端瀏覽器發(fā)送一個(gè)名為JSESSIONID(塞醒ID)的Cookie,它的值為該Session的id(也就是HttpSession.getId()的返回值)。Session依據(jù)該Cookie來識(shí)別是否為同一用戶。



URL地址重寫是對(duì)客戶端不支持Cookie的解決方案。URL地址重寫的原理是將該用戶Session的id信息重寫到URL地址中。服務(wù)器能夠解析重寫后的URL獲取Session的id。這樣即使客戶端不支持Cookie,也可以使用Session來記錄用戶狀態(tài)。HttpServletResponse類提供了encodeURL(Stringurl)實(shí)現(xiàn)URL地址重寫




cookie 和session 的區(qū)別:
1、cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙
   考慮到安全應(yīng)當(dāng)使用session。
4、單個(gè)cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。
總結(jié):
    Cookie通過在客戶端記錄信息確定用戶身份,Session通過在服務(wù)器端記錄信息確定用戶身份。

![圖片發(fā)自簡(jiǎn)書App](//upload-images.jianshu.io/upload_images/7889959-97f02c8aa87591bc.jpg)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容