HTTP是一種無狀態(tài)的請求乙嘀,但是在實際應(yīng)用中统屈,往往需要保存瀏覽器請求的一些數(shù)據(jù)阎曹,這時候我們可以使用cookie或session來實現(xiàn)昙衅。
筆者在做一個Spring Boot社區(qū)項目時度帮,需要做一個“顯示登錄信息”的功能歼捏,即顯示當(dāng)前用戶的用戶名、消息數(shù)笨篷、頭像等信息瞳秽。由于在網(wǎng)站中,HTTP是無狀態(tài)的率翅,無法保存當(dāng)前用戶的信息练俐,因此需要使用cookie或session保存一些數(shù)據(jù)。
本文介紹cookie和session的特點冕臭,以及session在分布式部署中的處理腺晾。
版權(quán)聲明:本文為博主原創(chuàng)文章,禁止轉(zhuǎn)載
作者博客:codesong.cn
created: 2019-11-24
為什么要用cookie/session辜贵?
HTTP請求是一種簡單的悯蝉、可擴展、無狀態(tài)有會話的請求托慨”怯桑“無狀態(tài)”也就是說客戶端向服務(wù)器發(fā)送一次請求后,不保存當(dāng)前狀態(tài),同一客戶端再次發(fā)送相同請求時嗡靡,服務(wù)器無法知道當(dāng)前請求是哪個用戶發(fā)出的跺撼。
瀏覽器和服務(wù)器是多對一的關(guān)系,為了判斷請求是由哪個客戶端發(fā)起的讨彼,可以使用cookie或session歉井。
cookie及其特點
- cookie是服務(wù)器發(fā)送到瀏覽器,并保存在瀏覽器端的一小塊數(shù)據(jù)哈误。
- 瀏覽器下次訪問該服務(wù)器時哩至,會自動攜帶該塊數(shù)據(jù),將其發(fā)送到服務(wù)器蜜自。
使用cookie能夠建立有狀態(tài)的會話:瀏覽器首次向服務(wù)器發(fā)送請求時菩貌,服務(wù)器創(chuàng)建一個cookie對象以記住瀏覽器,并在響應(yīng)時發(fā)送給瀏覽器重荠,瀏覽器接收后將cookie保存在本地箭阶。當(dāng)瀏覽器在此訪問服務(wù)器時,會在請求首部字段中加入cookie帶回給服務(wù)器戈鲁,服務(wù)器因此識別瀏覽器仇参。
cookie有以下特點:
- cookie保存在客戶端中,用戶可以直接查看婆殿,存在安全隱患诈乒。
- cookie多次向服務(wù)器發(fā)送請求,對服務(wù)器內(nèi)存壓力大
session的出現(xiàn)能夠解決cookie的以上問題婆芦。
session及其特點
- session是JavaEE的標準怕磨,保存在服務(wù)端來記錄客戶端的信息
- 數(shù)據(jù)存放在服務(wù)端更加安全,但是也會增加服務(wù)端的壓力
服務(wù)器接收到瀏覽器的請求后消约,創(chuàng)建一個session對象肠鲫。在響應(yīng)的時候,服務(wù)器返回一個含有session信息(sessionId)的cookie給瀏覽器或粮,瀏覽器會將cookie對象存在本地导饲,下次訪問服務(wù)器時將cookie對象發(fā)送給服務(wù)器。服務(wù)器接再次接收到請求被啼,會通過sessionId識別出瀏覽器帜消。
session的主要特點為:
- session數(shù)據(jù)保存在服務(wù)端,更加安全浓体,但是對服務(wù)器內(nèi)存壓力更大
分布式環(huán)境與session
在實際應(yīng)用中常會采用分布式服務(wù)器泡挺,在分布式部署中,session會出現(xiàn)一些問題命浴,相應(yīng)地有一些解決方法娄猫。
nginx是負載均衡的服務(wù)器贱除,瀏覽器直接訪問的是nginx這個代理,nginx會根據(jù)服務(wù)其狀態(tài)將請求分發(fā)給服務(wù)器媳溺。
顯然月幌,同一瀏覽器的請求并不能保證每次都被相同的服務(wù)器處理,這樣session就失去了其作用悬蔽。
解決分布式部署中session出現(xiàn)的這種問題扯躺,常見有三種方案:
- 粘性session(Sticky Session, 同一瀏覽器訪問同一服務(wù)器)
- 同步session(Session Replication, 將session同步到所有服務(wù)器)
- 共享session(Session Server, 有一臺服務(wù)器專門記錄session)
三種方案特點如下:
粘性session:
同一個瀏覽器的請求分配給同一個服務(wù)器,很難保證服務(wù)器負載均衡蝎困。
同步session
將每個瀏覽器的session同步到所有服務(wù)器录语,會對服務(wù)器性能產(chǎn)生影響。
服務(wù)器之間會產(chǎn)生耦合禾乘,不利于分布式部署澎埠。
共享session
共享session中有一臺服務(wù)器專門用來記錄session,其他服務(wù)器都向此服務(wù)器提交始藕、申請session蒲稳。分布式部署是為了解決單體的瓶頸,但萬一此服務(wù)器出現(xiàn)問題伍派,就會出現(xiàn)很大的影響江耀。
為解決以上三種方案帶來的問題,可以采用以下思路:
能用cookie就用cookie拙已,瀏覽器不方便存cookie時候决记,將cookie存儲在數(shù)據(jù)庫集群中摧冀。
缺點:關(guān)系型數(shù)據(jù)庫在硬盤里倍踪,不如從內(nèi)存中讀數(shù)據(jù)性能好。(可以考慮Redis)