http是無狀態(tài)、無連接的特性
- 無連接 —— 使用了keep-alive 來處理
- 無狀態(tài) —— 使用了Cookie/Session 來維持
解決無狀態(tài)的方案 2 種
-
基于Session實(shí)現(xiàn)的會(huì)話保持
<1> 在客戶端第一次向服務(wù)器發(fā)送 HTTP 請(qǐng)求后,服務(wù)器會(huì)創(chuàng)建一個(gè) Session 對(duì)象并將客戶端的身份信息以鍵值對(duì)的形式存儲(chǔ)下來;
<2> 然后分配一個(gè)會(huì)話標(biāo)識(shí)(SessionId)給客戶端,這個(gè)會(huì)話標(biāo)識(shí)一般保存在客戶端 Cookie 中,
<3> 之后每次該瀏覽器發(fā)送 HTTP 請(qǐng)求都會(huì)帶上 Cookie 中的 SessionId 到服務(wù)器,服務(wù)器根據(jù)會(huì)話標(biāo)識(shí)就可以將之前的狀態(tài)信息與會(huì)話聯(lián)系起來,從而實(shí)現(xiàn)會(huì)話保持。
優(yōu)點(diǎn):安全性高,因?yàn)闋顟B(tài)信息保存在服務(wù)器端。
缺點(diǎn)::由于大型網(wǎng)站往往采用的是分布式服務(wù)器,瀏覽器發(fā)送的 HTTP 請(qǐng)求一般要先通過負(fù)載均衡器才能到達(dá)具體的后臺(tái)服務(wù)器,倘若同一個(gè)瀏覽器兩次 HTTP 請(qǐng)求分別落在不同的服務(wù)器上時(shí),基于 Session 的方法就不能實(shí)現(xiàn)會(huì)話保持了。
【解決方法:采用中間件,例如 Redis,我們通過將 Session 的信息存儲(chǔ)在 Redis 中,使得每個(gè)服務(wù)器都可以訪問到之前的狀態(tài)信息】
-
基于Cookie實(shí)現(xiàn)的會(huì)話保持
<1> 當(dāng)服務(wù)器發(fā)送響應(yīng)消息時(shí),在 HTTP 響應(yīng)頭中設(shè)置 Set-Cookie 字段,用來存儲(chǔ)客戶端的狀態(tài)信息。
<2> 客戶端解析出 HTTP 響應(yīng)頭中的字段信息,并根據(jù)其生命周期創(chuàng)建不同的 Cookie,這樣一來每次瀏覽器發(fā)送 HTTP 請(qǐng)求的時(shí)候都會(huì)帶上 Cookie 字段,從而實(shí)現(xiàn)狀態(tài)保持。
<3> 基于 Cookie 的會(huì)話保持與基于 Session 實(shí)現(xiàn)的會(huì)話保持最主要的區(qū)別是前者完全將會(huì)話狀態(tài)信息存儲(chǔ)在瀏覽器 Cookie 中。
優(yōu)點(diǎn):服務(wù)器不用保存狀態(tài)信息, 減輕服務(wù)器存儲(chǔ)壓力,同時(shí)便于服務(wù)端做水平拓展。
缺點(diǎn):該方式不夠安全,因?yàn)闋顟B(tài)信息存儲(chǔ)在客戶端,這意味著不能在會(huì)話中保存機(jī)密數(shù)據(jù)。除此之外,瀏覽器每次發(fā)起 HTTP 請(qǐng)求時(shí)都需要發(fā)送額外的 Cookie 到服務(wù)器端,會(huì)占用更多帶寬。
- Cookie 被禁用了怎么辦?
通過重寫URL的方式將會(huì)話標(biāo)識(shí)放在URL的參數(shù)里,也可以實(shí)現(xiàn)會(huì)話保持。
總結(jié):
1)基于Session保存狀態(tài),返回給客戶端sessionId,每次請(qǐng)求帶上就行
2)基于Cookie保持狀態(tài),這樣每次都是帶上cookie狀態(tài)參數(shù)
3)Cookie 被禁用,通過重寫URL方式將標(biāo)識(shí)放在URL的參數(shù)里面。
公眾號(hào):
技術(shù)小難
簡(jiǎn)書
博客園 鏈接需要替換
CSDN
知乎
掘金
segmentfault
本文由mdnice多平臺(tái)發(fā)布