當前位置:
首頁 > 最新 > 談談HTTP狀態保持

談談HTTP狀態保持

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

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

會話機制一般有兩種實現方案,一種是基於Session實現,一種是基於Cookie實現。這兩種方案的本質區別是前者是將用戶狀態信息保存在服務端,後者是將用戶狀態信息保存在客戶端。那麼什麼又是用戶狀態信息呢?以前面的購物車為例,狀態信息就是商品信息。

一、基於Session實現會話保持

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

二、基於Cookie實現會話保持

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

三、兩者的優缺點

基於Session的會話保持的優點是具有安全性,因為狀態信息是保存在服務端的,缺點是不便於伺服器的水平擴展。大型網站的後台一般都不止一台伺服器,可能幾台甚至上百台,瀏覽器發送的HTTP請求一般要先通過負載均衡器才能到達具體的後台伺服器,這就會導致每次HTTP請求可能落到不同的伺服器上,比如說第一次HTTP請求落到server1上,第二次HTTP請求落到server2上。而Session默認是存儲在伺服器本機內存的,當多次請求落到不同的伺服器上時,上述方案就不能實現會話保持了。

基於Cookie的會話保持的優點是伺服器不用保存狀態信息,減輕服務端存儲壓力,也便於服務端做水平擴展。缺點是不夠安全,因為狀態信息是存儲在客戶端的,這意味著不能在會話中保存機密數據,另一個缺點是每次HTTP請求都需要發送額外的Cookie到服務端,會消耗更多帶寬。

總結

上述基於Session機制實現會話保持的方案中,當服務端有多台伺服器的時候可能無法正常工作,那麼是否有其他措施可以在服務端有多台伺服器的時候基於Session實現會話保持呢?答案是肯定的。由於篇幅所限,在此不詳述,後續會再次探討這個問題。

如果覺得這篇文章對你有幫助,可以關注本公眾號或轉發到朋友圈進行分享。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

走不完的路,考不完的試

TAG:全球大搜羅 |