無狀態協議

書生今天不吃飯發表於2018-03-30

在此前的HTTP中,曾談到過HTTP是一種無狀態的連線,這種協議對於事務處理沒有記憶能力,對同一個url請求沒有上下文關係,而且每次請求都是相對獨立的,它不會受前面請求的影響而影響本次請求的結果,因為伺服器並不會儲存客戶端的狀態,那麼客戶端必須每次帶上自己的狀態去請求伺服器,這樣伺服器才能認出你是誰。

舉個簡單的例子吧:

若為有狀態的:

B:我叫kingbora,我需要存放我的揹包。
S:好的。
B:我來取我的揹包。
S:好的。
複製程式碼

若為無狀態的:

B:我叫kingbora,我需要存放我的揹包。
S:好的。
B:我來取我的揹包。
S:你是誰?你的揹包是哪個?。
複製程式碼

那麼上面的例子上所需要的狀態便是使用者的身份,如果每次請求不帶上這個身份,伺服器無法識別使用者身份,也就無法返回正確的資訊。但是目前的HTTP都是有狀態的,主要是因為引入了Cookie和Session機制,來實現HTTP請求的狀態保持。

一、Cookie、Session

1.1 Cookie機制

理論上,一個使用者所有的請求操作都應該屬於同一個會話,每個會話之間相互獨立互不影響。 HTTP協議是無狀態的,一旦資料互動完畢,客戶端和伺服器之間的連線就會關閉,再次交換時需要重新建立新連線,也就意味著伺服器無法從連線上跟蹤會話。那麼若想跟蹤次會話,就需要引入Cookie這種會話機制。Cookie儲存在客戶端,具有不可跨域訪問和操作的特性,而且還能設定有效期等等,

1.2 Session機制

Session是伺服器端使用的一種記錄客戶端狀態的機制,使用上比Cookie簡單,但也相應增加了伺服器的儲存壓力。客戶端瀏覽器訪問伺服器的時候,伺服器把客戶端資訊以某種形式記錄在伺服器上,也就是Session,下次訪問時只需要從該Session中查詢該客戶的狀態就好。

如果說Cookie機制是通過檢查客戶身上的"通行證"來確定客戶身份的話,那麼Session機制就是通過檢查伺服器上的"客戶明細表"來確認客戶身份。Session相當於程式在伺服器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就行。

多個客戶端執行程式時,伺服器會儲存多個客戶端的Session。獲取Session的時候也不需要宣告獲取誰的Session。Session機制決定了當前客戶只會獲取到自己的Session,而不會獲取到別人的Session。各客戶的Session也彼此獨立,互不可見。Session一般存放在伺服器短的記憶體中,而且Session可以通過特殊的方式做持久化管理。

相關文章