session機制是一種服務器端的機制,服務器使用一種類似於散列表的結構(也可能就是使用散列表)來保存信息。
當程式需要為某個客戶端的請求創建一個session的時候,服務器首先檢查這個客戶端的請求裡是否已包含了一個session標識 - 稱為session id,如果已包含一個session id則說明以前已為此客戶端創建過session,服務器就按照session id把這個session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含session id,則為此客戶端創建一個session並且生成一個和此session相關聯的session id。保存這個session id的方式能采用cookie,這樣在交互過程中浏覽器能自動的按照規則把這個標識發揮給服務器。一般這個cookie的名字都是類似於SEEESIONID,而。比如weblogic對於web應用程式生成的cookie,JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,他的名字就是JSESSIONID。這個session cookie是保存在浏覽器的內存中的。
“只要關閉浏覽器,session就消失了”,這是一種很不嚴禁的說法。session是服務器創建的,要想刪除session除非程序通知服務器刪除一個session,否則服務器會一直保留。
然而浏覽器是不會在關閉的時候通知服務器他將要關閉,因此服務器根本不會知道浏覽器已關閉。之所以會有這種錯覺,是因為大部分session機制都使用會話cookie來保存session id,
而關閉浏覽器後這個cookie 是會銷毀的所以這個session id就消失了,再次連接服務器時也就無法找到原來的session。
如果服務器設置的cookie被保存到硬盤上,或使用某種手段改寫浏覽器發出的HTTP請求頭(URL重寫),把原來的session id發送給服務器,則再次打開浏覽器仍然能夠找到原來的session。
session持久化:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="true"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <%= session.getId() %> <% Cookie cookie = new Cookie("JSESSIONID", session.getId()); cookie.setMaxAge(20);//session持久化 20秒當浏覽器關閉20秒內這個session id依然存在 response.addCookie(cookie); %> </body> </html>
URL重寫:
Web 服務器在返回Response的時候,檢查頁面中所有的URL,包括所有的連接,和HTML Form的Action屬性,在這些URL後面加上“;jsessionid=XXX”。
下一次,用戶訪問這個頁面中的URL。jsessionid就會傳回到Web Server。
<form action="<%= response.encodeURL("hello.jsp") %>" method="post"> username: <input type="text" name="username" value="<%= username %>"/> <input type="submit" value="Submit"/> </form> <a href="<%= response.encodeURL("login.jsp") %>">重新登錄</a>
設置session超時:
關閉浏覽器不會導致session被刪除,迫使服務器為seesion設置了一個失效時間,當距離客戶端上一次使用session的時間超過這個失效時間時,服務器就能認為客戶端已停止了活動,才會把session刪除以節省存儲空間。一般我們會在WEB.xml中配置
<session-config> <session-timeout>30</session-timeout><!-- 30分鐘--> </session-config>
session的生命周期:
1、session的創建時間
一個常見的誤解是以為session在有客戶端訪問時就被創建,事實是直到某web服務器調用HttpServletRequest.getSession(true)這樣的語句時才被創建,注意如果JSP沒有顯示的使用 關閉session,則JSP文件在編譯成Servlet時將會自動加上這樣一條語句HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的session對象的來歷。由於session會消耗內存資源,因此,如果不打算使用session,應該在所有的JSP中關閉他,<%@ page session="false"%>。注意這個屬性只是禁用了
jsp中session這個隱含對象,我們依然可以顯式的使用session
<% HttpSession session = request.getSession(true); out.println(session); out.print("<br>"); //獲取 Session 的最大時效, 默認為 30 分鐘. out.print(session.getMaxInactiveInterval()); session.invalidate(); %>
總結:session的創建時間是客戶端第一次與wb服務器交互並且web服務器調用HttpServletRequest.getSession(true);
Session 對象的銷毀:
①. 直接調用 HttpSession 的 invalidate()
②. HttpSession 超過過期時間.
> 返回最大時效: getMaxInactiveInterval() 單位是秒 > 設置最大時效: setMaxInactiveInterval(int interval)
> 可以在 web.xml 文件中配置 Session 的最大時效, 單位是分鐘.
<session-config>
<session-timeout>30</session-timeout>
</session-config>
③. 卸載當前 WEB 應用. 注意: 關閉浏覽器不會銷毀 Session!