Tomcat與JavaWeb開發技術詳解HTTP會話的使用與管理


由於本人的閱讀能力有限,初次讀這一章的內容感覺就是有些雲裏霧裏,於是,結合書中的知識,在網上找了一些資料,我在此先對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()方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章