天天看點

HTTP無狀态協定

HTTP協定是無狀态協定。 無狀态是指協定對于 事務處理沒有記憶能力。缺少狀态意味着如果後續處理需要前面的資訊,則它必須重傳,這樣可能導緻每次連接配接傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。 用戶端與伺服器進行動态互動的Web應用程式出現之後,HTTP無狀态的特性嚴重阻礙了這些應用程式的實作,畢竟互動是需要承前啟後的,簡單的購物車程式也要知道使用者到底在之前選擇了什麼商品。于是,兩種用于保持HTTP連接配接狀态的技術就應運而生了,一個是 Cookie,而另一個則是 Session。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,進而再次使用之。正式這樣一個過程,使用者的狀态也就得以保持了。 綜上所述,HTTP本身是一個無狀态的連接配接協定,為了支援 用戶端與伺服器之間的互動,我們就需要通過不同的技術為互動存儲狀态,而這些不同的技術就是Cookie和Session了。

繼續閱讀