淺談HTTP的無狀態性

        HTTP是Hyper Text Transfer Protocol的縮寫,顧名思義,這個協議支持着超文本的傳輸。那麼什麼是超文本呢?說白了就是使用HTML編寫的頁面。通常,我們使用客戶端瀏覽器訪問服務器的資源,最常見的URL也是以html爲後綴的文件。因此,我們可以說超文本是網絡上最主要的資源。

        既然HTTP協議的目的在於支持超文本的傳輸,更加廣義一些就是支持資源的傳輸,那麼在客戶端瀏覽器向HTTP服務器發送請求,繼而HTTP服務器將相應的資源發回給客戶端這樣一個過程中,無論對於客戶端還是服務器,都沒有必要記錄這個過程,因爲每一次請求和響應都是相對獨立的,就好像你在自動售貨機前投下硬幣購買商品一樣,誰都不會也不需要記住這樣一個交易過程。一般而言,一個URL對應着唯一的超文本,而HTTP服務器也絕對公平公正,不管你是Michael,還是Jordon,它都會根據接收到的URL請求返回相同的超文本。正是因爲這樣的唯一性,使得記錄用戶的行爲狀態變得毫無意義,所以,HTTP協議被設計爲無狀態的連接協議符合它本身的需求。

        然而,隨着時間的推移,人們發現靜態的HTML着實無聊而乏味,增加動態生成的內容纔會令Web應用程序變得更加有用。於是乎,HTML的語法在不斷膨脹,其中最重要的是增加了表單(Form);客戶端也增加了諸如腳本處理、DOM處理等功能;對於服務器,則相應的出現了CGI(Common Gateway Interface)以處理包含表單提交在內的動態請求。在這種客戶端與服務器進行動態交互的Web應用程序出現之後,HTTP無狀態的特性嚴重阻礙了這些應用程序的實現,畢竟交互是需要承前啓後的,簡單的購物車程序也要知道用戶到底在之前選擇了什麼商品。於是,兩種用於保持HTTP連接狀態的技術就應運而生了,一個是Cookie,而另一個則是Session。

        Cookie是通過客戶端保持狀態的解決方案。從定義上來說,Cookie就是由服務器發給客戶端的特殊信息,而這些信息以文本文件的方式存放在客戶端,然後客戶端每次向服務器發送請求的時候都會帶上這些特殊的信息。讓我們說得更具體一些:當用戶使用瀏覽器訪問一個支持Cookie的網站的時候,用戶會提供包括用戶名在內的個人信息並且提交至服務器;接着,服務器在向客戶端回傳相應的超文本的同時也會發回這些個人信息,當然這些信息並不是存放在HTTP響應體(Response Body)中的,而是存放於HTTP響應頭(Response Header);當客戶端瀏覽器接收到來自服務器的響應之後,瀏覽器會將這些信息存放在一個統一的位置,對於Windows操作系統而言,我們可以從:[系統盤]:\Documents and Settings\[用戶名]\Cookies目錄中找到存儲的Cookie;自此,客戶端再向服務器發送請求的時候,都會把相應的Cookie再次發回至服務器。而這次,Cookie信息則存放在HTTP請求頭(Request Header)了。
        有了Cookie這樣的技術實現,服務器在接收到來自客戶端瀏覽器的請求之後,就能夠通過分析存放於請求頭的Cookie得到客戶端特有的信息,從而動態生成與該客戶端相對應的內容。通常,我們可以從很多網站的登錄界面中看到“請記住我”這樣的選項,如果你勾選了它之後再登錄,那麼在下一次訪問該網站的時候就不需要進行重複而繁瑣的登錄動作了,而這個功能就是通過Cookie實現的。
   
        與Cookie相對的一個解決方案是Session,它是通過服務器來保持狀態的。由於Session這個詞彙包含的語義很多,因此需要在這裏明確一下Session的含義。首先,我們通常都會把Session翻譯成會話,因此我們可以把客戶端瀏覽器與服務器之間一系列交互的動作稱爲一個Session。從這個語義出發,我們會提到Session持續的時間,會提到在Session過程中進行了什麼操作等等;其次,Session指的是服務器端爲客戶端所開闢的存儲空間,在其中保存的信息就是用於保持狀態。從這個語義出發,我們則會提到往Session中存放什麼內容,如何根據鍵值從Session中獲取匹配的內容等。
        要使用Session,第一步當然是創建Session了。那麼Session在何時創建呢?當然還是在服務器端程序運行的過程中創建的,不同語言實現的應用程序有不同創建Session的方法,而在Java中是通過調用HttpServletRequest的getSession方法(使用true作爲參數)創建的。在創建了Session的同時,服務器會爲該Session生成唯一的Session id,而這個Session id在隨後的請求中會被用來重新獲得已經創建的Session;在Session被創建之後,就可以調用Session相關的方法往Session中增加內容了,而這些內容只會保存在服務器中,發到客戶端的只有Session id;當客戶端再次發送請求的時候,會將這個Session id帶上,服務器接受到請求之後就會依據Session id找到相應的Session,從而再次使用之。正式這樣一個過程,用戶的狀態也就得以保持了。有關Session的內容還比較多,在以後的Post中,我還將繼續講述。

        綜上所述,HTTP本身是一個無狀態的連接協議,爲了支持客戶端與服務器之間的交互,我們就需要通過不同的技術爲交互存儲狀態,而這些不同的技術就是Cookie和Session了。

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