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