淺談HTTP的無狀態性

來源:互聯網
上載者:User

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了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.