Cookie和Session

Cookie:分爲瀏覽器Cookie和硬盤Cookie

•Cookie的英文原意是“點心”,它是用戶訪問Web服務器時,服務器在用戶硬盤上存放的信息,好像是服務器送給客戶的“點心”。
•服務器可以根據Cookie來跟蹤用戶,這對於需要區別用戶的場合(如電子商務)特別有用。

•一個Cookie包含一對Key/Value。下面的代碼生成一個Cookie並將它寫到用戶的硬盤上:
Cookie theCookie=new Cookie("cookieName","cookieValue");
response.addCookie(the Cookie);

上面這樣調用只是瀏覽器的Cookie,如果要讓他成爲硬盤Cookie,即寫硬盤上去,就要theCookie.setMaxAge()方法進行設置

注意:一個servlet/jsp設置的cookies能夠被同一個路徑下面或者子路徑下面的 servlet/jsp讀到,其他路徑無法讀取到

 

Session:

Session是放在服務器端的,在服務器端建立一塊內存,發給客戶端的是這個session的Id

Session用於跟蹤客戶的狀態。Session指的是在一段時間內,單個客戶與Web服務器的一連串相關的交互過程。在一個Session中,客戶可能會多次請求訪問同一個網頁,也有可能請求訪問各種不同的服務器資源。

Session的運行機制:

•當一個Session開始時,Servlet容器將創建一個HttpSession對象,在HttpSession對象中可以存放客戶狀態的信息(例如購物車)。
•Servlet容器爲HttpSession分配一個惟一標誌符,稱爲Session ID。Servlet容器把Session ID作爲Cookie保存在客戶的瀏覽器中。
•每次客戶發出HTTP請求時,Servlet容器可以從HttpServletRequest對象中讀取Session ID,然後根據Session ID找到相應的HttpSession對象,從而獲取客戶的狀態信息。

session原理圖:

Session的生命週期:

•當客戶第一次訪問Web應用中支持Session的某個網頁時,就會開始一個新的Session。
•接下來當客戶瀏覽這個Web應用的不同網頁時,始終處於同一個Session中。
•默認情況下,JSP網頁都是支持Session的,也可以通過以下語句顯式聲明支持Session:
<%@ page session= "true">

•在以下情況中,Session將結束生命週期,Servlet容器會將Session所佔用的資源釋放掉:
–客戶端關閉瀏覽器(真的這樣嗎?),實際上保存在服務端的session此時並未被銷燬,只有等到過了一段時間之後,即超時了,纔會被銷燬,只是客戶端關閉了瀏覽器之後,保存在瀏覽器端的進程中的sessionId隨着也被銷燬了,當下一次啓動瀏覽器訪問服務端的時候就不能再把上次的那個sessionId傳過去了.
–Session過期
–服務器端調用了HttpSession的invalidate()方法

 

如何做到在瀏覽器關閉時刪除session

•嚴格的講,做不到這一點。可以做一點努力的辦法是在所有的客戶端頁面裏使用javascript代碼window.onclose來監視瀏覽器的關閉動作,然後向服務器發送一個請求來刪除session。
•但是對於瀏覽器崩潰或者強行殺死進程這些非常規手段仍然無能爲力。
•實際上在項目中我們也不會這麼做,而是讓服務器在Session過期時將其刪除

 

session過期:

•Session過期是指當Session開始後,在一段時間內客戶沒有和Web服務器交互,這個Session會失效,HttpSession的setMaxInactiveInterval()方法可以設置允許Session保持不活動狀態的時間(以秒爲單位),如果超過這一時間,Session就會失效。

 

 

session和cookie的關係:

Cookie:安全性是沒問題的,他是不能跨域訪問的,即不能這個服務器訪問另外一個服務器所提供的cookie,瀏覽器是允許這樣做的.並且是加密的.

Cookie有兩種,一種是可以保存在硬盤上的,一個是保存在瀏覽器的進程當中的,其實session也叫會話cookie,就是屬於後一種的cookie

 

 

如何在禁用 Cookie 的瀏覽器中使用 Session

JavaServletAPI中引用Session機制來追蹤客戶的狀態。ServletAPI中定義了javax.servlet.http.HttpSession接口,Servlet容器必須實現這個接口。當一個Session開始時,Servlet容器將創建一個HttpSession對象,Servlet容器爲HttpSession分配一個唯一標識符,稱爲SessionID。Servlet容器將SessionID作爲Cookie保存在客戶的瀏覽器中。每次客戶發出HTTP請求時,Servlet容器可以從HttpRequest對象中讀取SessionID,然後根據 SessionID找到相應的HttpSession對象,從而獲取客戶的狀態信息。

當客戶端瀏覽器中禁止Cookie,Servlet容器無法從客戶端瀏覽器中取得作爲Cookie的SessionID,也就無法跟蹤客戶狀態。

JavaServletAPI中提出了跟蹤Session 的另一種機制,如果客戶端瀏覽器不支持Cookie,Servlet容器可以重寫客戶請求的URL,把SessionID添加到URL信息中。

HttpServletResponse接口提供了重寫URL的方法:public java.lang.StringencodeURL(java.lang.Stringurl)

該方法的實現機制爲:
●先判斷當前的Web組件是否啓用Session,如果沒有啓用Session,直接返回參數url。
●再判斷客戶端瀏覽器是否支持Cookie,如果支持Cookie,直接返回參數url;如果不支持Cookie,就在參數url中加入SessionID信息,然後返回修改後的url。如這樣:http://localhost:8080/drpservlet/SetCookie?sessionId=XXXhttp://www.mscto.com 

我們可以對網頁中的鏈接稍作修改,解決以上問題:
修改前:
<ahref=“maillogin.JSP“>
修改後:
<ahref=“<%=response.encodeURL(“maillogin.jsp“)%>“>

原文:http://blog.csdn.net/yjsuge/article/details/6528182

發佈了27 篇原創文章 · 獲贊 5 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章