程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> 深入理解和改進JSP/Servlet會話管理機制

深入理解和改進JSP/Servlet會話管理機制

編輯:關於JSP

在Web服務器端編程中,會話狀態管理是一個經常必須考慮的重要問題。本文分析JSP/Servlet的會話管理機制及其所面臨的問題,然後提出了一種改進的會話管理方法。

一、Servlet的會話管理機制

根據設計,HTTP是一種無狀態的協議。它意味著Web應用並不了解有關同一用戶以前請求的信息。維持會話狀態信息的方法之一是使用Servlet或者JSP容器提供的會話跟蹤功能。Servlet API規范定義了一個簡單的HttpSession接口,通過它我們可以方便地實現會話跟蹤。

HttpSession接口提供了存儲和返回標准會話屬性的方法。標准會話屬性如會話標識符、應用數據等,都以“名字-值”對的形式保存。簡而言之,HttpSession接口提供了一種把對象保存到內存、在同一用戶的後繼請求中提取這些對象的標准辦法。在會話中保存數據的方法是setAttribute(String s, Object o),從會話提取原來所保存對象的方法是getAttribute(String s)。

在HTTP協議中,當用戶不再活動時不存在顯式的終止信號。由於這個原因,我們不知道用戶是否還要再次返回,如果不采取某種方法解決這個問題,內存中會積累起大量的HttpSession對象。

為此,Servlet采用“超時限制”的辦法來判斷用戶是否還在訪問:如果某個用戶在一定的時間之內沒有發出後繼請求,則該用戶的會話被作廢,他的HttpSession對象被釋放。會話的默認超時間隔由Servlet容器定義。這個值可以通過getMaxInactiveInterval方法獲得,通過setMaxInactiveInterval方法修改,這些方法中的超時時間以秒計。如果會話的超時時間值設置成-1,則會話永不超時。Servlet可以通過getLastAccessedTime方法獲得當前請求之前的最後一次訪問時間。

要獲得HttpSession對象,我們可以調用HttpServletRequest對象的getSession方法。為了正確地維持會話狀態,我們必須在發送任何應答內容之前調用getSession方法。

用戶會話既可以用手工方法作廢,也可以自動作廢。作廢會話意味著從內存中刪除HttpSession對象以及它的數據。例如,如果一定時間之內(默認30分鐘)用戶不再發送請求,Java Web Server自動地作廢他的會話。

Servlet/JSP會話跟蹤機制有著一定的局限,比如:

· 會話對象保存在內存之中,占用了可觀的資源。

· 會話跟蹤依賴於Cookie。由於各種原因,特別是安全上的原因,一些用戶關閉了Cookie。

· 會話跟蹤要用到服務器創建的會話標識符。在多個Web服務器以及多個JVM的環境中,Web服務器不能識別其他服務器創建的會話標識符,會話跟蹤機制無法發揮作用。   要深入理解會話跟蹤機制,首先我們必須理解在Servlet/JSP容器中會話如何運作。

二、會話標識符

每當新用戶請求一個使用了HttpSession對象的JSP頁面,JSP容器除了發回應答頁面之外,它還要向浏覽器發送一個特殊的數字。這個特殊的數字稱為“會話標識符”,它是一個唯一的用戶標識符。此後,HttpSession對象就駐留在內存之中,等待同一用戶返回時再次調用它的方法。

在客戶端,浏覽器保存會話標識符,並在每一個後繼請求中把這個會話標識符發送給服務器。會話標識符告訴JSP容器當前請求不是用戶發出的第一個請求,服務器以前已經為該用戶創建了HttpSession對象。此時,JSP容器不再為用戶創建新的HttpSession對象,而是尋找具有相同會話標識符的HttpSession對象,然後建立該HttpSession對象和當前請求的關聯。

會話標識符以Cookie的形式在服務器和浏覽器之間傳送。如果浏覽器不支持Cookie又如何呢?此時,對服務器的後繼請求將不會帶有會話標識符。結果,JSP容器認為該請求來自一個新用戶,它會再創建一個HttpSession對象,而以前創建的HttpSession對象仍舊駐留在內存中,但該用戶以前的會話信息卻丟失了。

另外,Servlet/JSP容器只認可它自己創建的會話標識符。如果同一Web應用在“Web農場”(Web farm)的多台服務器上運行,則必須存在這樣一種機制:保證來自同一用戶的請求總是被定向到處理該用戶第一次請求的服務器。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved