為什麼HTTP是無狀態的?如何保持狀態(會話跟蹤技術、狀態管理)?
HTTP無狀態:
無狀態是指協議對於事務處理沒有記憶能力,不能儲存每次客戶端提交的資訊,即當伺服器返回應答之後,這次事務的所有資訊就都丟掉了。如果使用者發來一個新的請求,伺服器也無法知道它是否與上次的請求有聯絡。
例項解釋HTTP的無狀態性:
一個包含多圖片的網頁的瀏覽:
(1)建立連線,客戶端傳送一個請求,伺服器端返回一個HTML頁面(這裡的頁面只是一個純文字的頁面,也就是我們寫的HTML程式碼),關閉連線;
(2)瀏覽器解析HTML檔案,遇到圖片標記得到url,這時,客戶端和伺服器再建立連線,客戶端傳送一個圖片請求,伺服器返回圖片應答,關閉連線。【這裡又涉及到無狀態定義:對於伺服器來說,這次的請求雖然是同一個客戶端的請求但是伺服器還是不知道這個是之前的那個客戶端,即對於事務處理沒有記憶能力】
優點:
伺服器不用為每個客戶端連線分配記憶體來記憶大量狀態,也不用在客戶端失去連線時去清理記憶體,節省伺服器端資源,以更高效地去處理業務。
缺點:
缺少狀態意味著如果後續處理需要前面的資訊,則客戶端必須重傳,這樣可能導致每次連線每次連線傳送的資料量增大。
解決HTTP無狀態的方法:
針對這些缺點,可以採用會話跟蹤技術來解決這個問題。把狀態儲存在伺服器中,只發送回一個識別符號,瀏覽器在下次提交中把這個識別符號傳送過來;這樣,就可以定位儲存在伺服器上的狀態資訊了。
有四種會話跟蹤技術:
- COOKIE
- Session
- URL 重寫
- 作為隱藏域嵌入HTML表單中(隱藏表單域)
在瀏覽器和伺服器之間來回傳遞一個識別符號,這就是所謂的會話(session)跟蹤。
會話的有效期直到它被顯式地終止為止,或者當用戶在一段時間內沒有動作,由伺服器自動設定為過期。
目前沒有辦法通知伺服器使用者已經關閉瀏覽器,因為在瀏覽器和伺服器之間沒有一個持久的連線,並且瀏覽器關閉時也不向伺服器傳送資訊。
同時,關閉瀏覽器通常意味著會話ID丟失,COOKIE將過期,或者注入了資訊的URL將不能再使用。
所以當用戶再次開啟瀏覽器的時候,伺服器無法將新得到的請求與以前的會話聯絡起來,則只能建立一個新的會話。
然而,所有與前一個會話有關的資料依然存在伺服器上,直到會話過期被清除為止。