簡介
客戶端與伺服器進行動態互動的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了。