http://www.javalover.cn/html/11/349.html
HTTP是Hyper Text Transfer Protocol的縮寫,顧名思義,這個協(xié)議支持著超文本的傳輸。那么什么是超文本呢?說白了就是使用HTML編寫的頁面。通常,我們使用客戶端瀏覽器訪問服務器的資源,最常見的URL也是以html為后綴的文件。因此,我們可以說超文本是網(wǎng)絡上最主要的資源。
既然HTTP協(xié)議的目的在于支持超文本的傳輸,更加廣義一些就是支持資源的傳輸,那么在客戶端瀏覽器向HTTP服務器發(fā)送請求,繼而HTTP服務器將相應的資源發(fā)回給客戶端這樣一個過程中,無論對于客戶端還是服務器,都沒有必要記錄這個過程,因為每一次請求和響應都是相對獨立的,就好像你在自動售貨機前投下硬幣購買商品一樣,誰都不會也不需要記住這樣一個交易過程。
一般而言,一個URL對應著唯一的超文本,而HTTP服務器也絕對公平公正,不管你是Michael,還是Jordon,它都會根據(jù)接收到的URL請求返回相同的超文本。正是因為這樣的唯一性,使得記錄用戶的行為狀態(tài)變得毫無意義,所以,HTTP協(xié)議被設計為無狀態(tài)的連接協(xié)議符合它本身的需求。
然而,隨著時間的推移,人們發(fā)現(xiàn)靜態(tài)的HTML著實無聊而乏味,增加動態(tài)生成的內(nèi)容才會令Web應用程序變得更加有用。于是乎,HTML的語法在不斷膨脹,其中最重要的是增加了表單(Form);客戶端也增加了諸如腳本處理、DOM處理等功能;對于服務器,則相應的出現(xiàn)了CGI(Common Gateway Interface)以處理包含表單提交在內(nèi)的動態(tài)請求。在這種客戶端與服務器進行動態(tài)交互的Web應用程序出現(xiàn)之后,HTTP無狀態(tài)的特性嚴重阻礙了這些應用程序的實現(xiàn),畢竟交互是需要承前啟后的,簡單的購物車程序也要知道用戶到底在之前選擇了什么商品。于是,兩種用于保持HTTP連接狀態(tài)的技術就應運而生了,一個是Cookie,而另一個則是Session。
Cookie是通過客戶端保持狀態(tài)的解決方案。從定義上來說,Cookie就是由服務器發(fā)給客戶端的特殊信息,而這些信息以文本文件的方式存放在客戶端,然后客戶端每次向服務器發(fā)送請求的時候都會帶上這些特殊的信息。讓我們說得更具體一些:當用戶使用瀏覽器訪問一個支持Cookie的網(wǎng)站的時候,用戶會提供包括用戶名在內(nèi)的個人信息并且提交至服務器;接著,服務器在向客戶端回傳相應的超文本的同時也會發(fā)回這些個人信息,當然這些信息并不是存放在HTTP響應體(Response Body)中的,而是存放于HTTP響應頭(Response Header);當客戶端瀏覽器接收到來自服務器的響應之后,瀏覽器會將這些信息存放在一個統(tǒng)一的位置,對于Windows操作系統(tǒng)而言,我們可以從:[系統(tǒng)盤]:\Documents and Settings\[用戶名]\Cookies目錄中找到存儲的Cookie;自此,客戶端再向服務器發(fā)送請求的時候,都會把相應的Cookie再次發(fā)回至服務器。而這次,Cookie信息則存放在HTTP請求頭(Request Header)了。
有了Cookie這樣的技術實現(xiàn),服務器在接收到來自客戶端瀏覽器的請求之后,就能夠通過分析存放于請求頭的Cookie得到客戶端特有的信息,從而動態(tài)生成與該客戶端相對應的內(nèi)容。通常,我們可以從很多網(wǎng)站的登錄界面中看到“請記住我”這樣的選項,如果你勾選了它之后再登錄,那么在下一次訪問該網(wǎng)站的時候就不需要進行重復而繁瑣的登錄動作了,而這個功能就是通過Cookie實現(xiàn)的。
與Cookie相對的一個解決方案是Session,它是通過服務器來保持狀態(tài)的。由于Session這個詞匯包含的語義很多,因此需要在這里明確一下Session的含義。首先,我們通常都會把Session翻譯成會話,因此我們可以把客戶端瀏覽器與服務器之間一系列交互的動作稱為一個Session。從這個語義出發(fā),我們會提到Session持續(xù)的時間,會提到在Session過程中進行了什么操作等等;其次,Session指的是服務器端為客戶端所開辟的存儲空間,在其中保存的信息就是用于保持狀態(tài)。從這個語義出發(fā),我們則會提到往Session中存放什么內(nèi)容,如何根據(jù)鍵值從Session中獲取匹配的內(nèi)容等。
要使用Session,第一步當然是創(chuàng)建Session了。那么Session在何時創(chuàng)建呢?當然還是在服務器端程序運行的過程中創(chuàng)建的,不同語言實現(xiàn)的應用程序有不同創(chuàng)建Session的方法,而在Java中是通過調(diào)用HttpServletRequest的getSession方法(使用true作為參數(shù))創(chuàng)建的。在創(chuàng)建了Session的同時,服務器會為該Session生成唯一的Session id,而這個Session id在隨后的請求中會被用來重新獲得已經(jīng)創(chuàng)建的Session;在Session被創(chuàng)建之后,就可以調(diào)用Session相關的方法往Session中增加內(nèi)容了,而這些內(nèi)容只會保存在服務器中,發(fā)到客戶端的只有Session id;當客戶端再次發(fā)送請求的時候,會將這個Session id帶上,服務器接受到請求之后就會依據(jù)Session id找到相應的Session,從而再次使用之。正式這樣一個過程,用戶的狀態(tài)也就得以保持了。
綜上所述,HTTP本身是一個無狀態(tài)的連接協(xié)議,為了支持客戶端與服務器之間的交互,我們就需要通過不同的技術為交互存儲狀態(tài),而這些不同的技術就是Cookie和Session了。