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