關於“無狀態的HTTP連接提供有狀態的連接

HTTP是無狀態鏈接,請求-迴應完畢後客戶端和服務器之間的鏈接就會斷開。那麼服務器是如何記住用戶的,例如網上購物車,每次新添加購物項,上次添加的 購物項還能存在,這是如何實現的?可以推測應該是客戶端或服務器端將購物的信息記錄下來,創建一個新的鏈接時候讀取記錄下來的數據,這樣就實現無狀態的 HTTP連接提供有狀態的連接的效果。
服務器端:
在網絡服務器看來,所有的HTTP請求都獨立於之前的請求,也就是說他只識別你這次請求頭中包含的信息,然後做出對應的響應。狀態管理機制克服了HTTP 的一些限制並允許網絡客戶端和服務器端維護請求間的關係,這種關係維持的期間叫做Session(會話)。Session是服務器端的一種保存上下文信息 的機制,它是針對每一個用戶的,session的值保存在服務器端。當服務器端程序需要爲客戶端請求創建一個session的時候,會首先檢查請求中是否 包含了一個session標識—sessionID,如果包含sessionID,說明以前就已經爲該用戶創建過session,服務器會直接按照這個 sessionID將對應的session檢索出來使用(沒有檢索到可能會新建一個);如果客戶端請求沒有包含sessionID,則爲這個用戶新建一個 session並生成一個相關聯的sessionID(sessionID的值應該是一個不會重複,也不容易找到規律的字符串),這個sessionID 將在本次響應中返回給客戶端保存。
購物車例子:
當你買第一個物品的時候點擊“購買”,瀏覽器將請求發送到服務器(該請求中沒有sessionID,因爲這是你要買的第一個物品,之前沒有和服務器 交互),服務器發現沒有sessionID,就會爲客戶端創建一個session和與之相關聯的sessionID,並把剛創建的這個sessionID 在本次響應中返回給客戶端,客戶端的瀏覽器接收到返回的響應把這個sessionID存儲,當你再次向購物車添加物品時候,瀏覽器會在後臺自動將你存儲的 sessionID發送給服務器,服務器按照這個sessionID檢索到對應的session,然後進行處理返回給你頁面,這樣你才能夠看到上次添加的 購物項。
客戶端:
在客戶端用來存儲服務器返回的sessionID和其他一些信息的稱爲cookie。正統的cookie分發是通過擴展HTTP協議來實現的,服務器通過 在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie,在交互的時候瀏覽器檢查所有存儲的cookie,如果某個 cookie所聲明的作用範圍大於等於將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發送給服務器。可以使用HEAD命令 得到服務器的響應頭,有的網站響應頭中包含set-cookie項(例如hi.baidu.com),該項中包含一個名值對,過期時間,路徑和域,這些都 是由服務器指定。路徑就是跟在域後面的url路徑,路徑和域組成了cookie的作用範圍的大小;設置過期時間,就會將cookie保存到硬盤上,關閉瀏 覽器再打開,cookie依然有效,直到請求的時間超過了指定的時間。如果不設置過期時間,則cookie一般不存儲在硬盤上而是保存在瀏覽器的內存裏, 當然這種行爲並不是規範規定的。所以cookie有兩種,一種是存儲到本地的文本文件之中的,叫做persistent (持久化的)cookie;另一種是並不存儲在本地硬盤之中,而是放在瀏覽器的內存裏面,我叫做session cookie。Persistent cookie可以在不同的瀏覽器進程間共享,比如兩個IE窗口。而對於session cookie,不同的瀏覽器有不同的處理方式,有的瀏覽器可以跨窗口使用比如Firefox,有的不能比如IE但是IE允許一個窗口生成的窗口(子窗口) 共享session cookie。
推測:如果客戶端禁用cookie,那麼將無法向購物車中添加物品。
禁用IE的cookie,訪問當當網,選中一本書,點擊購買,發現返回的頁面爲空白頁面,並沒有我購買的書;允許使用cookie,購買返回的頁面中購買 的書已被添加到購物車之中。說明推測是正確的。可是如果禁用瀏覽器的cookie就無法訪問需要創建session的服務器了嗎?由於cookie可以被 人爲的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞迴服務器。經常被使用的一種技術叫做URL重寫,就是把session id 直接附加在URL路徑的後面,這樣服務器就可以解析url地址後面的sessionID進行處理。發送SessionID有兩種方式,一種就是將 sessionID存放在cookie裏面瀏覽器自動發送;另一種是當客戶端禁用cookie時,通過URL重寫將sessionID發送給服務器。
Session的生命週期:
Session什麼時候會被服務器刪除,有人可能會認爲當客戶端的瀏覽器窗口關閉時候session就會被刪除,其實不然。事實上除非程序通知服務器刪除 一個session,否則服務器會一直保留。瀏覽器關閉之前不會通知服務器,所以服務器不會知道瀏覽器什麼時候關閉,之所以有“瀏覽器關 閉,session就消失”這樣的感覺,是因爲大多數的session機制都是用會話 cookie(session cookie)來保存sessionID,這樣瀏覽器關閉之後sessionID就消失了,再次連接服務器時候,分配了新的sessionID,也就不能 找到以前那個session了,但是如果用persistent cookie來保存sessionID的話,再打開新的瀏覽器也能夠找到那個sessionID加到請求之中,服務器就能夠找到那個session。由於 瀏覽器的關閉或者瀏覽器的進程被強行殺死或者斷網,服務器都無法知道,所以服務器設置了一個失效時間,只要距離客戶端上次訪問的時間超過了失效時間,則認 爲客戶端活動停止了,此時刪除session節省存儲空間。
例子:登錄電子郵箱,長時間(超過失效時間)沒有操作,再對郵箱操作的話頁面刷新之後提示你頁面已經過期,此時session已經被刪除。
總結:HTTP是無狀態鏈接,因爲要實現有狀態鏈接的效果,所以採用session和cookie兩種機制。 客戶端請求需要包含服務器指定的唯一的sessionID,如果請求中沒有sessionID,服務器將爲該請求創建一個session和與之相關聯的 sessionID並把這個sessionID放入響應之中,並加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie,將響應返回給客戶端,客 戶端的瀏覽器按照規則解析響應,如果瀏覽器支持cookie則將sessionID和其他信息存儲起來(persistent cookie 或者session cookie),下次再次訪問同一服務器時候瀏覽器將對應的cookie和請求頭一起發送給服務器,服務器按照sessionID進行檢索找到對應的 session進行處理。

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