文章目錄
由於本人的閱讀能力有限,初次讀這一章的內容感覺就是有些雲裏霧裏,於是,結合書中的知識,在網上找了一些資料,我在此先對Session的知識做些總結,接而再對課本內容進行總結。
什麼是session?
session是一種會話管理技術,session用來保存會話過程中的數據,保存的數據存儲到服務器端。
session原理:
基於cookie實現的,更確切的說是基於會話級別的cookie實現的。
HttpSession API
session常用方法:
-
得到session的id(JESSIONID對應的值):getId();
-
設置session的生命時長:setMaxInactiveInterval(int interval)
-
銷燬session:invalidate();
-
得到session: HttpSession session=getSession();
session域對象:作用範圍一次完整的會話(包含多個請求)
-
存值:setAttribute(String key,Object obj);
-
取值:Object obj=getAttribute(String key);
-
移除:removeAttribute(String key);
總結域對象:
- ServletContext域對象>session域對象>request域對象
request域對象:
- 作用範圍一次請求,通常和轉發操作配合使用
session域對象:
- 作用範圍一次會話,通常和重定向配合使用
ServletContext域對象:
- 作用範圍整個項目,和重定向,轉發操作都可以配合使用
Session超時管理
session對象是由生命時長,它的默認存活時間是30分鐘
具體配置找tomcat軟件下的web.xml文件,如下:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
立即銷燬session對象:
invalidate()
session的工作流程大致如下:
會話簡介
會話指的是再一段時間內,單個客戶與Web應用的一連串相關的交互過程。
一個瀏覽器進程第一次訪問Web應用中的任意一個支持會話的網頁,Servlet容器試圖尋找HTTP請求中表示SessionID的Cookie,因此就認爲一個新的會話開始了,於是創建一個HttpSession對象,爲它分配唯一的SessionID,然後把SessionID作爲Cookie添加到HTTP響應結果中。當瀏覽器接收到HTTP響應結果後,會把其中表示SessionID的Cookie保存在服務器中。
瀏覽器繼續訪問Web應用中任意一個支持會話的網頁,在本次HTTP請求中會包含表示SessionID的Cookie,Servlet容器試圖尋找HTTP請求中表示SessionID的Cookie,由於能得到這樣的Cookie,因此認爲本次請求已經處於一個會話中了,Servlet不再創建新的HttpServlet對象,而是從Cookie中獲取SessionID,然後根據SessionID找到內存中對應的HttpSession對象。
HttpSession的生命週期及會話範圍
會話範圍是指瀏覽器與一個Web應用進行一次會話的過程,會話範圍與HttpSession對象的生命週期對應。
Web應用中的JSP或Servlet組件可通過這些方法訪問會話:
-
getId():返回SessionID
-
invalidate():銷燬當前對話,Servlet容器會釋放HttpSession對象所佔用的資源
-
setAttribute(String name,Object obj):將一對name/value屬性保存在HttpSession對象中
-
getAttribute(String name):根據name參數返回保存在HttpSession對象中的屬性值
-
removeAttribute(String name):從HttpSession對象中刪除name參數的屬性
-
isNew():判斷是否新創建的會話。如果是返回true,否則返回false
-
setMaxInactiveInterval(int interval):設置一個會話可以處於不活動狀態的最長時間,以秒爲單位。如果設置參數爲負數,,會話將永遠不會過期。
-
getMaxInactiveInterval():讀取當前會話可以處於不活動的最長時間
-
getServletContext():返回會話所屬的Web應用的ServletContext對象
以下情況會開始新的會話,即創建新的HttpSession對象:
-
一個瀏覽器進程第一次訪問Web應用中的支持會話的任意網頁。
-
當前瀏覽器進程與Web應用的一次會話已經被銷燬後,瀏覽器再次訪問Web應用的任一網頁
使用會話的JSP範例程序
以下JSP代碼把用戶名信息存放在會話範圍內:
<%
<%session.setAttribute("username",name); %>
if(!session.isNew()){
name=(String)session.getAttribute("username");
if(name==null)name="";
}
String name=null;
name=request.getParameter("username");
if(name!=null)
session.getAttribute("username",name);
else {
name=(String) session.getAttribute("username");
if(name==null)
response.sendRedirect("maillogin.jsp");
}
%>
使用會話的Servlet範例程序
Jsp文件在默認情況下都支持會話,而HttpServlet類在默認情況下不支持會話,這是JSP與HttpServlet的一個小小區別
在HttpServletRequest接口中提供了兩個與會話有關的方法:
-
getSession():使得當前HttpServlet支持會話。
-
getSession():如果參數爲true,等價於調用HttpServletRequest()的getSession()方法
代碼示例:
HttpSession session=request.getSession(true);
ShoppingCart cart=(ShoppingCart)session.getAttribute("cart");
if(cart==null){
cart=new ShoppingCart();
session.setAttribute("cart",cart);
}
書中例子用到HashMap<String ,Integer>,以及Serializable()(序列化)接口,瞭解一下。
通過重寫URL來跟蹤會話
如果瀏覽器支持Cookie,Servlet容器就把SessionID作爲Cookie保存在瀏覽器中,如果不支持Cookie,本章將介紹跟蹤會話的另一種方式。
如果瀏覽器不支持Cookie,Servlet容器可以重寫Web組件的URL,把sessionID添加到URL信息中。HttpServletRequest提供了重寫URL的方法:
public java.lang.String encodeURL(String url)
例如
修改前
<a href="maillogin.jsp">
修改後
<a href="<= response.encodeURL("maillogin.jsp")>">
會話的持久化
會話的持久化有兩個好處:1.節約內存空間 2.確保在服務器重啓或單個Web應用重啓後,能恢復重啓前的會話。
Tomcat採用會話管理器來管理會話,其中包括兩種:
- 標準會話管理器
- PersistenManager類提供更多的管理會話的功能
會話的監聽
Servlet API中定義了4個用於監聽會話中的各種時間的監聽器接口:
(1)HttpSessionListener
接口:監聽創建會話及銷燬會話的事件,它有兩個方法:
- sessionCreated(HttpSessionEvent event)當Servlet容器創建了一個會話後,會調用此方法
- sessionDestroyed(HttpSessionEvent event)當Servlet容器將要銷燬一個會話之前,會調用此方法
(2)HttpSessionAttributeListener
接口:監聽向會話中加入屬性,替換屬性,和刪除屬性的事件,有如下三個方法。
- attributeAdded(HttpSessionBindingEvent event)
- attributeRemoved(HttpSessionBindingEvent event)
- attributeReplaced(HttpSessionBinding event)
(3)HttpSessionBindingListener接口
:監聽會話與一個屬性綁定或解除綁定的事件
- valueBound(HttpSessionBindingEvent event):當Web應用把一個屬性與會話綁定後,Servlet會調用此方法
- valueUnbound(HttpSessionBindingEvent event):當Web應用將要把一個屬性與一個會話解除綁定之前會調用此方法
(4)HttpSessionActivationListener
接口:監聽會話被激活和被擱置的事件,它有兩個方法:
- sessionDidActivate(HttpSessionEvent event):激活後調用
- sessionWILLPassivate(HttpSessionEvent event):擱置前調用
用HttpSessionListener統計在線人數:
Web應用的當前所有會話數目就等於在線用戶數量
用HttpSessionBingdingListener統計在線人數
User類實現了HttpSessionBingdingListener接口的valueBound()方法和valueUnbound()方法