Cookie 與session的產生過程
我們都知道HTTP協議本身是無狀態的,客戶只需要簡單的向服務器來發送請求下載某些文件,客戶端向服務器端發送的每次請求都是獨立的。對於當前的web應用,HTTP的“無狀態”,導致許多應用都不得不花費大量的精力來記錄用戶的操作步驟。就像我們上面介紹的第一種情況,銀行職員要花費大量的精力來記憶每一位用戶的存/取款記錄。
程序員很快發現,如果能夠提供一些按需生成的動太信息,會使web的交互能力大大增強。程序員一方面在HTML中添加表單、腳本、DOM等客戶端行為,來增加web應用與客戶端的交互性。另一方面在服務器端測出現了CGI規范以響應客戶端的動態請求,作為傳輸載體的HTTP協議添加了文件上載、cookie 等特性。那cookie的原理與我們上面介紹的使用存折記錄用戶應為的方式是一樣一樣的。
通過前面的例子我們已經發現,通過cookie的方式存儲信息,可能會存在一點定的安全性,因為所有的信息都是寫在客戶端的,客戶可能會對這些信息進行修改或清除。然后就又出現session的方式用於保存用戶行為,這種方式的原理與前面介紹銀行卡的方式是一樣的。
具體來說cookie機制采用的是在客戶端保持狀態的方案,而session機制采用的是在服務器端保持狀態的方案。同時我們也看到,由於采用服務器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要借助於cookie機制來達到保存標識的目的,但實際上它還有其他選擇。
cookie與session的機制與原理
cookie機制。正統的cookie分發是通過擴展HTTP協議來實現的,服務器通過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie。然而純粹的客戶端腳本如JavaScript或者VBScript也可以生成cookie。而cookie的使用是由瀏覽器按照一定的原則在后台自動發送給服務器的。瀏覽器檢查所有存儲的cookie,如果某個cookie所聲明的作用范圍大於等於將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發送給服務器。
cookie的內容主要包括:名字,值,過期時間,路徑和域。路徑與域一起構成cookie的作用范圍。若不設置過期時間,則表示這個cookie的生命期為瀏覽器會話期間,關閉瀏覽器窗口,cookie就消失。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。會話cookie一般不存儲在硬盤上而是保存在內存里,當然這種行為並不是規范規定的。若設置了過期時間,瀏覽器就會把cookie保存到硬盤上,關閉后再次打開瀏覽器,這些cookie仍然有效直到超過設定的過期時間。存儲在硬盤上的cookie可以在不同的瀏覽器進程間共享,比如兩個IE窗口。而對於保存在內存里的cookie,不同的瀏覽器有不同的處理方式。
session機制。session機制是一種服務器端的機制,服務器使用一種類似於散列表的結構(也可能就是使用散列表)來保存信息。
當程序需要為某個客戶端的請求創建一個session時,服務器首先檢查這個客戶端的請求里是否已包含了一個session標識------------稱為session id,如果已包含則說明以前已經為此客戶端創建過session,服務器就按照session id把這個session檢索出來使用(檢索不到,會新建一個),如果客戶端請求不包含session id,則為此客戶端創建一個session並且生成一個與此session相關聯的session id,session id的值應該是一個既不會重復,又不容易被找到規律以仿造的字符串,這個session id將被在本次響應中返回給客戶端保存。
保存這個session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發揮給服務器。一般這個cookie的名字都是類似於SEEESIONID。但cookie可以被人為的禁止,則必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞回服務器。
經常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的后面。還有一種技術叫做表單隱藏字段。就是服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把session id傳遞回服務器。
