HTTP狀態保持

1、爲什麼需要對http進行狀態保持

HTTP協議本身是無狀態的,無狀態的意思是瀏覽器發起的每個HTTP請求,對於服務端而言都是彼此獨立的,即服務端無法直接通過HTTP協議將用戶的多次HTTP請求聯繫在一起。這就好比顧客跟自動售貨機的關係一樣,無論你在一臺自動售貨機上購買了多少次商品,自動售貨機都沒法“記住”你,也就是說你每一次在該售貨機上購買商品的時候,自動售貨機都會把你當成一個陌生的顧客來對待。

隨着Web應用的複雜,很多場景下需要維護用戶狀態才能正常工作。典型的應用就是購物車。當你在網上商城購買商品的時候,每看到一個喜歡的商品可以把它先加入購物車,然後繼續瀏覽其他商品,等瀏覽完商品後再進行商品的結算。在這個過程中,你與服務器的通信是通過多次HTTP請求完成的,瀏覽器必須通過某種機制識別出你發出的所有HTTP請求是來自同個計算機的同個瀏覽器,或者來自同一個賬戶。否則服務器就沒辦法將購物車裏的商品跟某個人聯繫起來,因此也無法實現購物車功能。這種維持HTTP狀態的機制就是會話機制。

2、對http進行狀態保持的發展歷

(1)、基於Session實現會話保持

基於Session實現會話保持的原理是:在會話的開始(即客戶端第一次向服務器發送HTTP請求時),服務器會將會話狀態保存起來(一般保存在本機內存,當然也可以保存在其他存儲系統),然後分配一個會話標識(也叫SessionId)給客戶端,這個會話標識一般保存在瀏覽Cookie裏,以後每次瀏覽器發送HTTP請求的時候,都會帶上這個會話標識到服務器,服務器拿到這個會話標識之後就可以把之前存儲在服務端的狀態信息與該會話聯繫起來,因此也就實現了會話保持。當然如果遇到瀏覽器禁用了Cookie的情況,則可以通過url重寫的方式將會話標識放在url的參數裏,這樣也可以實現會話保持。

但是通過session的方式來實現會話的保存有個致命的問題:在做負載均衡的時候如何在多臺服務器之間保存session的問題,爲了解決這個問題出現了很多種方案。

在這裏插入圖片描述
這種方案是通過在不同服務器之間複製session來解決session的問題,但是這種方案在機器非常多的時候就很難實現,需要複製很多次,於是就出現了以下方案。

在這裏插入圖片描述
在一個地方將session統一管理,所有的服務器都訪問這個session,開發者發現服務端來維護這個會話太麻煩,於是就把會話的管理交給了前端。

(2)、基於Cookie實現會話保持

基於Cookie實現會話保持與上述基於Session實現會話保持的最主要區別是前者完全將會話狀態信息存儲在瀏覽器Cookie中,這樣一來每次瀏覽器發送HTTP請求的時候都會帶上狀態信息,因此也就可以實現狀態保持。以上述購物車應用爲例,服務端可以將商品信息加密(也可以不加密,但爲了安全性,一般會此對狀態信息進行加密處理)後保存在瀏覽器的Cookie中,這樣一來服務端就能知道你在瀏覽的過程中添加了哪些商品到購物車中了。

cookie其實就是瀏覽器本地存儲數據的一種實現,那麼把會話存儲在瀏覽器其實是很不安全的。

不管cookie還是session其實都是用存儲的方式來解決這個問題,說白了其實就是需要一種驗證用戶操作的合法性的問題,最後token通過簽名的方式解決了驗證的問題,其實本質是用時間換取了空間的方式解決的。

(3)、token的驗證方式
在這裏插入圖片描述
在用戶登陸成功後將用戶的userid用加密算法生成token,然後下發給客戶端,客戶端每次請求都會帶上這個token,然後服務端拿到這個token會做驗證。
在這裏插入圖片描述
總體思路:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章