Javaweb session和cookie的關係
HttpSession介面封裝了Session的概念,Servlet容器提供了這個介面的實現。當一個會話開始的時候,Servlet容器就建立一個HttpSession物件,在HttpSession物件中存放客戶的狀態資訊,Servlet容器為HttpSession物件分配一個唯一的Session ID,將其作為Cookie(或者作為URL的一部分,利用URL重寫機制)傳送給瀏覽器,瀏覽器在記憶體中儲存這個Cookie。當這個客戶再次傳送HTTP請求時,瀏覽器將Cookie隨請求一起傳送,Servlet容器從請求物件中讀取Session ID,然後根據Session ID找到對應的HttpSession物件,從而得到客戶的狀態資訊。
Cookie是在瀏覽器訪問Web資源時,由Web伺服器在HTTP響應訊息中通過Set-Cookie欄位傳送給瀏覽器的一組資料。伺服器利用響應報頭Set-Cookie來發送Cookie資訊。在Servlet規範中,用於會話跟蹤的Cookie的名字必須是JSESSIONID。
為了跟蹤使用者的會話,伺服器端在建立Session後,需要將SessionID交給客戶端,在客戶端下次請求時,將這個ID隨請求一起傳送回來。採用Cookie的方式,將SessionID傳送給客戶端。當客戶端不接受Cookie的時候,可以使用URL重寫的機制來跟蹤使用者的會話。
Session是一種伺服器端技術,Session物件在伺服器端建立,在伺服器端儲存資料資訊並通過SessionID進行跟蹤。而Cookie在客戶端(瀏覽器記憶體或硬碟)儲存資訊(解決方案:會員卡或者目標卡?)。一般來說,登入資訊等重要資訊存放到session內,其他資訊可以放到Cookie中。
通常將用於會話跟蹤的Cookie叫做會話Cookie(臨時Cookie),名字為JSESSIONID,通常儲存在瀏覽器的記憶體中。是不能被不同的瀏覽器程序所共享的。共享只能發生在同一個瀏覽器程序的不同視窗中。而將會話Cookie儲存到硬碟上(永久Cookie)可以在多個瀏覽器程序之間共享。因為瀏覽器關閉,則意味著儲存SessionID的Cookie(臨時Cookie)消失,而Session仍然存在於伺服器端,直到超時時間間隔發生。如果會話Cookie儲存到硬碟(永久Cookie),那麼將SessionID傳送給伺服器,再次開啟的瀏覽器就能找到原來的Session。