程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> Servlet容器的會話跟蹤

Servlet容器的會話跟蹤

編輯:關於JSP

HTTP協議是一種無狀態的協議,而對於現在的web應用而言,我們往往需要記錄從特定客戶端的一系列請求間的聯系。現在已經有很多會話跟蹤的技術,但是對於程序員而言都不是很方便直接使用。Servlet規范定義了一個簡單的HttpSession接口以方便Servlet容器進行會話跟蹤而不需要開發者注意實現的細節。一般而言,有兩種最常用的會話跟蹤機制,一種就是URL重寫。在客戶端不接受cookie的情況下可以使用URL重寫進行會話跟蹤。

URL重寫包括向URL路徑添加一些容器可以解釋的數據。規范要求會話ID必須編碼在URL路徑中,參數名稱必須是jsessionid,例如: http://www.myserver.com/catalog/index.html;jsessionid=1234,另一種就是現在最常用的cookie了,規范要求所有的Servlet都必須支持cookie。容器向客戶端發送一個cookie,客戶端在後續的處於同一個會話的請求中向服務器返回該cookie。會話跟蹤cookie的名字必須是JSESSIONID。

新出現的一種會話功能是SSL會話,SSLSecure Sockets Layer,安全套接字層)是HTTPS協議使用的一種加密技術,內建了會話跟蹤功能,Servlet容器可以非常容易的使用這些數據建立會話跟蹤。但是HTTPS不是規范要求Servlet必須支持的協議) 因為HTTP是一種基於請求響應的協議,因此會話只有在客戶端加入它以後才被新建立。當會話跟蹤信息被成功的返回給服務器以指示會話給建立時客戶端才算加入了一個會話。如果客戶端沒有加入會話,那麼下一次請求不會被認為是會話的一部分。如何客戶端還不知道會話或者客戶端選擇不加入一個會話,那麼會話被認為是新的。開發者必須自己設計自己的應用中的會話處理狀態,在什麼地方沒有加入會話,什麼地方不能加入會話以及什麼地方不需要加入會話。

規范要求HttpSession在應用或者Servlet上下文級別有效,諸如cookie這樣的建立會話的底層機制可以在上下文中共享,但是對於那些外露的對象,以及更重要的是對象的那些屬性是不能在上下文中共享的。對於會話的屬性的綁定而言,任何對象都可以綁定到某個命名屬性。被綁定的屬性對象對於其它處於相同ServletContext並且處於同一個會話處理中的其它Servlet也是可見的。

某些對象在被加入會話或者被從會話中移除時要求得到通知,這樣的信息可以通過讓該對象實現HttpSessionBindingListener接口得到。該接口定義了兩個方法用以標記被綁定到會話或者從會話中被移除。 valueBound方法在對象通過getAttribute之前就被調用,而valueUnbound方法在對象已經不能通過getAttribute得到後才被調用。

由於HTTP是無狀態協議,因此客戶端不再活動時沒有什麼明顯的信號,這也就意味著只有一種機制可以用於表明客戶端不再活動:超時。會話的缺省的時限由Servlet容器定義並且可以通過HttpSession的getMaxInactiveInterval得到,開發者也可以通過使用setMaxInactiveInterval
方法進行設置,這些方法返回的單位是秒,如果時限被設置為-1,那麼意味著永遠不會超時。通過調用HttpSession的getLastAccessedTime方法,我們可以得到在當前請求之前的訪問時間。當會話中的一個請求被Servlet上下文處理時會話就被認為被訪問了。

另外需要注意的就是一些很重要的會話的語義問題。
◆多線程問題:多個請求線程可能會同時訪問同一個會話,開發者有責任以適當的方式同步訪問會話中的資源。
◆分布式環境:對於被標記為可分布的應用而言,同一會話中的所有請求只能被單一的VM處理。同時,放入HttpSession中的所有對象都必須實現 Serializable接口,否則容器可能會拋出IllegalArgumentException在jboss_tomcat下沒有拋出這個異常,但是如果在關閉服務器時還有未完成的會話,那麼服務器在試圖存儲會話時會出現串行化異常,在重新啟動的時候會試圖回復會話,也會出現異常)。
這個限制意味著開發者不會遇到非可分布容器中的那些並發問題。另外容器提供者可以通過將一個會話對象以及它的內容從分布式系統的一個活動節點移動到系統的其它不同節點的能力來保證可伸縮性。
◆客戶端的語義:基於cookie或者SSL證書通常是被web浏覽器控制並且不聯系到特定浏覽器窗口的事實,從客戶端應用的所有窗口發送到容器的請求都可能是同一個會話。為了達到最大的可移植性,開發者不能總假設特定客戶端的所有窗口的請求都處於同一個會話中。

  1. 介紹Servlet 2.4版功能
  2. 多種Servlet接口介紹
  3. 接口介紹-Servlet Context
  4. Servlet的注冊方法
  5. 介紹Servlet容器

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