一文掌握Spring Cookie和Session 是什么及區(qū)別介紹
HTTP 協(xié)議自身是屬于“無(wú)狀態(tài)”協(xié)議
- 無(wú)狀態(tài):默認(rèn)情況下,HTTP 協(xié)議的客戶端和服務(wù)器之間的這次通信和下次通信之間沒(méi)有直接的聯(lián)系
但是在實(shí)際開(kāi)發(fā)中,我們很多時(shí)候是需要知道請(qǐng)求之間的關(guān)聯(lián)關(guān)系的
- 例如登錄網(wǎng)站成功后,第二次訪問(wèn)的時(shí)候服務(wù)器就能知道該請(qǐng)求是否是已經(jīng)登錄過(guò)了

上述圖片中的“令牌”通常就存儲(chǔ)在 Cookie 字段中
比如去醫(yī)院掛號(hào):
- 看病之前先掛號(hào),掛號(hào)時(shí)需要提供身份證號(hào),同時(shí)得到一張“就診卡”,這個(gè)就診卡就相當(dāng)于患者的“令牌”
- 后續(xù)去各個(gè)科室進(jìn)行檢查、診斷、開(kāi)藥等操作,都不必再出示身份證了,只要憑“就診卡”就可以識(shí)別出當(dāng)前患者的身份
- 看完病之后,不想要就診卡了,就可以注銷這個(gè)卡。此時(shí)患者的身份和就診卡的關(guān)聯(lián)關(guān)系就被銷毀了(類似于網(wǎng)站的注銷功能)
- 又來(lái)看病,可以辦一張新的就診卡,此時(shí)就得到了一個(gè)新的“令牌”
此時(shí)在服務(wù)器這邊就需要記錄“令牌”的信息,以及令牌對(duì)應(yīng)的用戶信息,這個(gè)就是 Session 機(jī)制所做的工作
理解 Session
會(huì)話就是對(duì)話的意思

在計(jì)算機(jī)領(lǐng)域,會(huì)話是一個(gè)客戶與服務(wù)器之間的不中斷的請(qǐng)求響應(yīng)。對(duì)客戶的每個(gè)請(qǐng)求,服務(wù)器能夠識(shí)別出請(qǐng)求來(lái)自于同一個(gè)客戶。當(dāng)一個(gè)未知的客戶向 Web 應(yīng)用程序發(fā)送第一個(gè)請(qǐng)求時(shí)就開(kāi)始了一個(gè)會(huì)話。當(dāng)客戶明確結(jié)束會(huì)話或服務(wù)器在一個(gè)時(shí)限內(nèi)沒(méi)有收到客戶的任何請(qǐng)求時(shí),會(huì)話就結(jié)束了
比如我們打客服電話
- 每次打客服電話,都是一個(gè)會(huì)話,掛斷電話,會(huì)話就結(jié)束了
- 下次再打客服電話,就又是一個(gè)新的會(huì)話
- 如果我們長(zhǎng)時(shí)間不說(shuō)話,沒(méi)有新的請(qǐng)求,會(huì)話也會(huì)結(jié)束
服務(wù)器同一時(shí)刻收到的請(qǐng)求時(shí)很多的。服務(wù)器需要清楚地區(qū)分每個(gè)請(qǐng)求時(shí)從屬于哪個(gè)用戶,也就是屬于哪個(gè)會(huì)話,就需要在服務(wù)器這邊記錄每個(gè)會(huì)話以及與用戶的信息的對(duì)應(yīng)關(guān)系
Session 是服務(wù)器為了保存用戶信息而創(chuàng)建的一個(gè)特殊的對(duì)象

Session 的本質(zhì)就是一個(gè)“哈希表”,存儲(chǔ)了一些鍵值對(duì)結(jié)構(gòu)。Key 就是 Session,Value 就是用戶信息(用戶信息可以根據(jù)需求靈活設(shè)計(jì))


SessionId是由服務(wù)器生成的一個(gè)“唯一性字符串”,從Session機(jī)制的角度來(lái)看,這個(gè)唯一性字符串稱為“SessionId”。但是站在整個(gè)登錄流程中看待,也可以把這個(gè)唯一性字符串稱為“token”- 上述例子中的令牌 ID,就可以看做是
SessionId,只不過(guò)令牌除了 ID 之外,還會(huì)帶一些其他信息,比如時(shí)間、簽名等
token 和 SessionId 是相似的,但是不一樣。token 是身份的證明,SessionId 是其中一種實(shí)現(xiàn)方式

- 當(dāng)用戶登錄的時(shí)候,服務(wù)器在
Session中新增一個(gè)新紀(jì)錄,并把SessionId返回給客戶端(通過(guò) HTTP 響應(yīng)中的Set-Cookie字段返回) - 客戶端后續(xù)再給服務(wù)器發(fā)送請(qǐng)求的時(shí)候,需要在請(qǐng)求中帶上
SessionId(通過(guò) HTTP 請(qǐng)求中的Cookie字段帶上) - 服務(wù)器收到請(qǐng)求之后,根據(jù)請(qǐng)求中的
SessionId在Session信息中獲取到對(duì)應(yīng)的用戶信息,再進(jìn)行后續(xù)操作。若找不到,則重新創(chuàng)建Session,并把SessionId返回
Session 默認(rèn)是保存在內(nèi)存中的。如果重啟服務(wù)器,則 Session 數(shù)據(jù)就會(huì)丟失
Cookie 和 Session 的區(qū)別
Cookie是客戶端保存用戶信息的一種機(jī)制。Session是服務(wù)器端保存用戶信息的一種機(jī)制Cookie和Session之間主要是通過(guò)SessionId關(guān)聯(lián)起來(lái)的,SessionId是Cookie和Session之間的橋梁Cookie和Session經(jīng)常會(huì)在一起配合使用,但不是必須配合- 完全可以用
Cookie來(lái)保存一些數(shù)據(jù)在客戶端。這些數(shù)據(jù)不一定是用戶身份信息,也不一定是SessionId Session中的SessionId也不需要非得通過(guò)Cookie/Set-Cookie來(lái)傳遞,比如通過(guò)URL來(lái)傳遞
- 完全可以用
到此這篇關(guān)于一文掌握Spring Cookie和Session 是什么的文章就介紹到這了,更多相關(guān)Spring Cookie和Session內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中的構(gòu)造方法(構(gòu)造函數(shù))與普通方法區(qū)別及說(shuō)明
這篇文章主要介紹了Java中的構(gòu)造方法(構(gòu)造函數(shù))與普通方法區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
Java spring boot 實(shí)現(xiàn)支付寶支付功能的示例代碼
這篇文章主要介紹了Java spring boot 實(shí)現(xiàn)支付寶支付功能,本文通過(guò)實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
SpringBoot實(shí)現(xiàn)圖片上傳及本地訪問(wèn)
在SpringBoot項(xiàng)目中,處理靜態(tài)文件訪問(wèn)尤其是實(shí)時(shí)更新的文件如商品圖片,可通過(guò)配置WebMvcConfig將本地文件映射到URL路徑上,以解決重啟項(xiàng)目才能訪問(wèn)文件的問(wèn)題,本文詳解如何保存和訪問(wèn)這些文件,幫助開(kāi)發(fā)者優(yōu)化項(xiàng)目文件管理2022-09-09
Spring Task定時(shí)任務(wù)每天零點(diǎn)執(zhí)行一次的操作
這篇文章主要介紹了Spring Task定時(shí)任務(wù)每天零點(diǎn)執(zhí)行一次的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
Spring?Boot深入學(xué)習(xí)數(shù)據(jù)訪問(wèn)之Spring?Data?JPA與Hibernate的應(yīng)用
Spring?Data?JPA是Spring?Data的子項(xiàng)目,在使用Spring?Data?JPA之前,先了解一下Hibernate,因?yàn)镾pring?Data?JPA是由Hibernate默認(rèn)實(shí)現(xiàn)的2022-10-10
解決安裝mysqlclient的時(shí)候出現(xiàn)Microsoft Visual C++ 14.0 is required報(bào)錯(cuò)
這篇文章主要介紹了解決安裝mysqlclient的時(shí)候出現(xiàn)Microsoft Visual C++ 14.0 is required報(bào)錯(cuò)問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11
Java線程中的Thread.yield()詳細(xì)解析
這篇文章主要介紹了Java線程中的Thread.yield()詳細(xì)解析,yield()讓當(dāng)前線程從運(yùn)行狀態(tài)?轉(zhuǎn)為?就緒狀態(tài),以允許具有相同優(yōu)先級(jí)的其他線程獲得運(yùn)行機(jī)會(huì),需要的朋友可以參考下2023-11-11
Spring事務(wù)隔離級(jí)別簡(jiǎn)介及實(shí)例解析
這篇文章主要介紹了Spring事務(wù)隔離級(jí)別簡(jiǎn)介及實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
解決微服務(wù)下Mybatis?xml無(wú)效綁定問(wèn)題及分析Invalid?bound?statement
這篇文章主要介紹了解決微服務(wù)下Mybatis?xml無(wú)效綁定問(wèn)題及分析Invalid?bound?statement,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11

