Java的Servlet的監聽器Listener 筆記250417
分類1:
一、生命周期監聽器
監聽容器(如 Tomcat)中應用、會話或請求的創建與銷毀。
監聽器接口 | 觸發事件 | 典型用途 |
---|---|---|
ServletContextListener | 應用啟動 (contextInitialized )、關閉 (contextDestroyed ) | 全局資源管理(如數據庫連接池) |
HttpSessionListener | 會話創建 (sessionCreated )、銷毀 (sessionDestroyed ) | 統計在線用戶數 |
ServletRequestListener | 請求開始 (requestInitialized )、結束 (requestDestroyed ) | 記錄請求耗時或日志 |
二、屬性監聽器
監聽特定作用域(應用、會話、請求)中的屬性增刪改操作。
監聽器接口 | 觸發事件 | 典型用途 |
---|---|---|
ServletContextAttributeListener | 應用作用域屬性添加、替換、移除 | 全局配置變更日志或刷新緩存 |
HttpSessionAttributeListener | 會話作用域屬性添加、替換、移除 | 跟蹤用戶登錄狀態或購物車變更 |
ServletRequestAttributeListener | 請求作用域屬性添加、替換、移除 | 調試請求屬性或數據校驗 |
三、會話綁定監聽器
監聽對象自身在會話中的綁定與解綁事件。
監聽器接口 | 觸發事件 | 典型用途 |
---|---|---|
HttpSessionBindingListener | 對象被存入會話 (valueBound )、移除 (valueUnbound ) | 自動管理資源(如連接釋放) |
HttpSessionActivationListener | 會話鈍化 (sessionWillPassivate )、活化 (sessionDidActivate ) | 分布式會話中對象序列化支持 |
四、其他監聽器
其他與會話或異步請求相關的監聽器。
監聽器接口 | 觸發事件 | 典型用途 |
---|---|---|
HttpSessionIdListener | 會話 ID 變更 (sessionIdChanged ) | 跟蹤會話 ID 變化(需容器支持) |
AsyncListener | 異步請求開始、完成、超時或錯誤 | 監控異步請求生命周期 |
分類2:
1. ServletContext 相關監聽器
ServletContextListener
:監聽ServletContext
的創建和銷毀事件。contextInitialized(ServletContextEvent sce)
:在ServletContext
初始化時調用。contextDestroyed(ServletContextEvent sce)
:在ServletContext
銷毀時調用。
ServletContextAttributeListener
:監聽ServletContext
屬性的添加、刪除和替換事件。attributeAdded(ServletContextAttributeEvent event)
:屬性被添加時調用。attributeRemoved(ServletContextAttributeEvent event)
:屬性被刪除時調用。attributeReplaced(ServletContextAttributeEvent event)
:屬性被替換時調用。
2. HttpSession 相關監聽器
HttpSessionListener
:監聽HttpSession
的創建和銷毀事件。sessionCreated(HttpSessionEvent se)
:會話創建時調用。sessionDestroyed(HttpSessionEvent se)
:會話銷毀時調用。
HttpSessionAttributeListener
:監聽HttpSession
屬性的添加、刪除和替換事件。attributeAdded(HttpSessionBindingEvent event)
:屬性被添加時調用。attributeRemoved(HttpSessionBindingEvent event)
:屬性被刪除時調用。attributeReplaced(HttpSessionBindingEvent event)
:屬性被替換時調用。
HttpSessionBindingListener
:監聽綁定到HttpSession
的對象的狀態變化。valueBound(HttpSessionBindingEvent event)
:對象被綁定到會話時調用。valueUnbound(HttpSessionBindingEvent event)
:對象從會話中移除時調用。
HttpSessionActivationListener
:監聽HttpSession
的鈍化和活化事件。sessionWillPassivate(HttpSessionEvent se)
:會話鈍化前調用。sessionDidActivate(HttpSessionEvent se)
:會話活化后調用。
3. ServletRequest 相關監聽器
ServletRequestListener
:監聽ServletRequest
的創建和銷毀事件。requestInitialized(ServletRequestEvent sre)
:請求初始化時調用。requestDestroyed(ServletRequestEvent sre)
:請求銷毀時調用。
ServletRequestAttributeListener
:監聽ServletRequest
屬性的添加、刪除和替換事件。attributeAdded(ServletRequestAttributeEvent event)
:屬性被添加時調用。attributeRemoved(ServletRequestAttributeEvent event)
:屬性被刪除時調用。attributeReplaced(ServletRequestAttributeEvent event)
:屬性被替換時調用。
4. 其他監聽器
AsyncListener
:監聽異步操作的完成、超時或失敗事件。
這些監聽器可以通過實現相應的接口來創建,并通過在 web.xml
文件中配置或使用 @WebListener
注解來注冊。
ServletContextListener 的用法筆記250417
ServletRequestListener 的用法筆記250417
HttpSessionListener 的用法筆記250417
ServletContextAttributeListener 的用法筆記250417
ServletRequestAttributeListener 的用法筆記250417
HttpSessionAttributeListener 的用法筆記250417
HttpSessionBindingListener 的用法筆記250417
HttpSessionActivationListener 的用法筆記250417
@WebServlet @WebFilter @WebListener 的用法 筆記250418
1?? 參考 1
Servlet 規范中定義了多種監聽器(Listener),用于監聽 Web 應用中的不同事件(如應用啟動、會話創建、屬性變化等)。以下是所有 Servlet 監聽器的分類及詳細說明:
一、按作用域分類的監聽器
1. 應用級別(ServletContext)
監聽器接口 | 說明 |
---|---|
ServletContextListener | 監聽 Servlet 上下文(應用)的創建和銷毀。 (應用啟動時初始化資源,關閉時釋放資源) |
ServletContextAttributeListener | 監聽 ServletContext 中屬性的增刪改。 (如動態配置更新、全局狀態監控) |
2. 會話級別(HttpSession)
監聽器接口 | 說明 |
---|---|
HttpSessionListener | 監聽 會話(Session)的創建和銷毀。 (統計在線用戶數、會話超時處理) |
HttpSessionAttributeListener | 監聽 HttpSession 中屬性的增刪改。 (如用戶登錄狀態跟蹤、購物車更新) |
HttpSessionBindingListener | 對象自身實現,監聽被綁定到會話或從會話移除的事件。 (資源自動管理,如臨時文件清理) |
HttpSessionActivationListener | 監聽會話的 序列化(鈍化)和反序列化(激活) 事件。 (分布式集群環境下的資源管理) |
3. 請求級別(ServletRequest)
監聽器接口 | 說明 |
---|---|
ServletRequestListener | 監聽 請求的初始化和銷毀。 (記錄請求耗時、請求級資源初始化) |
ServletRequestAttributeListener | 監聽 ServletRequest 中屬性的增刪改。 (請求流程跟蹤、動態參數校驗) |
二、各監聽器核心方法及典型場景
1. ServletContextListener
public interface ServletContextListener {void contextInitialized(ServletContextEvent sce); // 應用啟動時調用void contextDestroyed(ServletContextEvent sce); // 應用關閉時調用
}
- 典型場景:
- 初始化數據庫連接池、讀取全局配置文件。
- 注冊后臺服務(如定時任務、消息隊列消費者)。
2. ServletContextAttributeListener
public interface ServletContextAttributeListener {void attributeAdded(ServletContextAttributeEvent event); // 屬性新增void attributeRemoved(ServletContextAttributeEvent event); // 屬性移除void attributeReplaced(ServletContextAttributeEvent event); // 屬性替換
}
- 典型場景:
- 動態更新全局配置(如切換維護模式)。
- 審計全局屬性變更日志。
3. HttpSessionListener
public interface HttpSessionListener {void sessionCreated(HttpSessionEvent se); // 會話創建時調用void sessionDestroyed(HttpSessionEvent se); // 會話銷毀時調用
}
- 典型場景:
- 統計在線用戶數。
- 會話超時自動清理資源(如臨時文件)。
4. HttpSessionAttributeListener
public interface HttpSessionAttributeListener {void attributeAdded(HttpSessionBindingEvent event); // 屬性新增void attributeRemoved(HttpSessionBindingEvent event); // 屬性移除void attributeReplaced(HttpSessionBindingEvent event); // 屬性替換
}
- 典型場景:
- 用戶登錄/登出狀態跟蹤。
- 實時同步購物車數據到數據庫。
5. HttpSessionBindingListener
public interface HttpSessionBindingListener {void valueBound(HttpSessionBindingEvent event); // 對象被綁定到會話時調用void valueUnbound(HttpSessionBindingEvent event); // 對象從會話移除時調用
}
- 典型場景:
- 對象自動管理資源(綁定創建資源,解綁釋放資源)。
- 會話綁定的對象狀態同步(如在線用戶列表)。
6. HttpSessionActivationListener
public interface HttpSessionActivationListener {void sessionWillPassivate(HttpSessionEvent se); // 會話鈍化(序列化)前調用void sessionDidActivate(HttpSessionEvent se); // 會話激活(反序列化)后調用
}
- 典型場景:
- 分布式環境中會話數據恢復(如重新初始化網絡連接)。
- 鈍化前釋放非序列化資源(如文件句柄)。
7. ServletRequestListener
public interface ServletRequestListener {void requestInitialized(ServletRequestEvent sre); // 請求開始時調用void requestDestroyed(ServletRequestEvent sre); // 請求結束時調用
}
- 典型場景:
- 記錄請求處理時間。
- 請求級資源管理(如線程局部變量初始化)。
8. ServletRequestAttributeListener
public interface ServletRequestAttributeListener {void attributeAdded(ServletRequestAttributeEvent event); // 屬性新增void attributeRemoved(ServletRequestAttributeEvent event); // 屬性移除void attributeReplaced(ServletRequestAttributeEvent event); // 屬性替換
}
- 典型場景:
- 跟蹤請求處理流程(如記錄中間狀態)。
- 動態校驗請求屬性合法性。
三、配置方式
1. XML 配置(web.xml
)
<web-app><!-- 應用級別監聽器 --><listener><listener-class>com.example.MyContextListener</listener-class></listener><!-- 會話級別監聽器 --><listener><listener-class>com.example.MySessionListener</listener-class></listener>
</web-app>
2. 注解配置(Servlet 3.0+)
@WebListener
public class MyRequestListener implements ServletRequestListener {// 實現方法
}
四、監聽器對比總結
分類 | 監聽器 | 核心事件 | 典型用途 |
---|---|---|---|
應用級別 | ServletContextListener | 應用啟動/關閉 | 全局資源管理(如連接池) |
ServletContextAttributeListener | 全局屬性增刪改 | 配置熱更新、審計日志 | |
會話級別 | HttpSessionListener | 會話創建/銷毀 | 在線用戶統計、會話資源管理 |
HttpSessionAttributeListener | 會話屬性增刪改 | 用戶狀態跟蹤、數據同步 | |
HttpSessionBindingListener | 對象綁定/解綁 | 資源自動管理 | |
HttpSessionActivationListener | 會話鈍化/激活 | 分布式會話資源恢復 | |
請求級別 | ServletRequestListener | 請求開始/結束 | 性能監控、請求級資源管理 |
ServletRequestAttributeListener | 請求屬性增刪改 | 流程跟蹤、動態校驗 |
五、注意事項
-
線程安全:
ServletContext
和HttpSession
中的共享資源需確保線程安全(如使用AtomicInteger
或同步鎖)。ServletRequest
是線程局部的,無需額外同步。
-
性能影響:
- 避免在監聽器中執行耗時操作(如復雜計算、同步 I/O)。
- 高頻事件(如請求屬性變更)需優化監聽邏輯。
-
遞歸調用:
- 在監聽器中修改同一作用域的屬性可能導致循環觸發事件。
-
分布式環境:
- 會話監聽器需處理序列化問題(如實現
Serializable
)。 - 使用
HttpSessionActivationListener
管理鈍化/激活邏輯。
- 會話監聽器需處理序列化問題(如實現
在 Java Servlet 規范中,Servlet 監聽器(Listener)用于監聽 Web 應用中的不同事件(如應用啟動、會話創建、屬性變更等)。以下是所有 Servlet 監聽器的分類、接口及核心用途:
一、Servlet 監聽器分類
1. 應用級別(ServletContext 相關)
監聽器接口 | 觸發事件 | 核心用途 |
---|---|---|
ServletContextListener | 應用初始化/銷毀(contextInitialized /contextDestroyed ) | 全局資源管理(如連接池、配置文件加載) |
ServletContextAttributeListener | 全局屬性增刪改(attributeAdded /Removed /Replaced ) | 動態配置更新、全局狀態監控(如維護模式切換) |
2. 會話級別(HttpSession 相關)
監聽器接口 | 觸發事件 | 核心用途 |
---|---|---|
HttpSessionListener | 會話創建/銷毀(sessionCreated /sessionDestroyed ) | 在線用戶統計、會話資源初始化/清理 |
HttpSessionAttributeListener | 會話屬性增刪改(attributeAdded /Removed /Replaced ) | 用戶登錄狀態跟蹤、購物車數據同步 |
HttpSessionBindingListener | 對象綁定/解綁到會話(valueBound /valueUnbound ) | 資源自動管理(如臨時文件創建/刪除) |
HttpSessionActivationListener | 會話鈍化/激活(sessionWillPassivate /sessionDidActivate ) | 分布式環境下會話數據持久化與恢復(如集群環境) |
HttpSessionIdListener (Servlet 3.1+) | 會話 ID 變更(sessionIdChanged ) | 跟蹤會話 ID 變化(如安全審計) |
3. 請求級別(ServletRequest 相關)
監聽器接口 | 觸發事件 | 核心用途 |
---|---|---|
ServletRequestListener | 請求開始/結束(requestInitialized /requestDestroyed ) | 請求耗時統計、請求級資源初始化(如線程局部變量) |
ServletRequestAttributeListener | 請求屬性增刪改(attributeAdded /Removed /Replaced ) | 請求流程跟蹤、動態參數校驗 |
二、監聽器對比與典型場景
1. 應用級別監聽器
-
ServletContextListener
示例:應用啟動時初始化數據庫連接池,關閉時釋放資源。@WebListener public class AppInitListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// 初始化連接池DataSource pool = createConnectionPool();sce.getServletContext().setAttribute("dbPool", pool);}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// 關閉連接池DataSource pool = (DataSource) sce.getServletContext().getAttribute("dbPool");if (pool != null) pool.close();} }
-
ServletContextAttributeListener
示例:監聽全局配置參數變更,觸發服務熱更新。public void attributeReplaced(ServletContextAttributeEvent event) {if ("apiKey".equals(event.getName())) {reloadExternalService(); // 重新加載外部服務配置} }
2. 會話級別監聽器
-
HttpSessionListener
示例:統計在線用戶數。public void sessionCreated(HttpSessionEvent se) {AtomicInteger userCount = (AtomicInteger) se.getSession().getServletContext().getAttribute("userCount");userCount.incrementAndGet(); }
-
HttpSessionBindingListener
示例:用戶登錄對象綁定會話時自動記錄日志。public class User implements HttpSessionBindingListener {@Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println("用戶綁定到會話: " + this.username);}@Overridepublic void valueUnbound(HttpSessionBindingEvent event) {System.out.println("用戶從會話解綁: " + this.username);} }
3. 請求級別監聽器
ServletRequestListener
示例:記錄請求處理時間。public void requestInitialized(ServletRequestEvent sre) {sre.getServletRequest().setAttribute("startTime", System.currentTimeMillis()); }public void requestDestroyed(ServletRequestEvent sre) {long startTime = (long) sre.getServletRequest().getAttribute("startTime");System.out.println("請求耗時: " + (System.currentTimeMillis() - startTime) + "ms"); }
三、配置方式
1. XML 配置(web.xml
)
<web-app><!-- 應用監聽器 --><listener><listener-class>com.example.AppInitListener</listener-class></listener><!-- 會話監聽器 --><listener><listener-class>com.example.SessionTracker</listener-class></listener>
</web-app>
2. 注解配置(Servlet 3.0+)
@WebListener
public class MyListener implements ServletContextListener {// 實現方法
}
四、注意事項
-
線程安全
ServletContext
和HttpSession
中的共享資源需線程安全(如用AtomicInteger
)。ServletRequest
是線程局部的,無需同步。
-
性能優化
- 避免在監聽器中執行耗時操作(如復雜計算或 I/O)。
- 高頻事件(如請求屬性變更)需輕量級處理。
-
遞歸陷阱
- 在監聽器中修改同一作用域的屬性可能導致循環觸發事件。
-
分布式環境
- 會話監聽器需處理序列化(如實現
Serializable
)。 - 使用
HttpSessionActivationListener
管理鈍化/激活邏輯。
- 會話監聽器需處理序列化(如實現
五、總結
Servlet 監聽器是管理 Web 應用生命周期的核心工具,通過以下方式提升應用的可維護性:
- 應用級別:全局資源初始化、配置熱更新。
- 會話級別:用戶狀態跟蹤、分布式會話管理。
- 請求級別:性能監控、動態校驗。
合理選擇監聽器,結合 XML 或注解配置,可以實現對 Web 應用全生命周期的精細化控制。
2?? 參考 2
Java Servlet API 提供了 8 種監聽器(Listener),用于監聽 Web 應用生命周期中的關鍵事件。以下是每種監聽器的用途和典型場景:
1. 應用級監聽器
(1) ServletContextListener
- 作用:監聽
ServletContext
(Web 應用上下文)的初始化和銷毀。 - 方法:
contextInitialized(ServletContextEvent sce) // 應用啟動時觸發 contextDestroyed(ServletContextEvent sce) // 應用關閉時觸發(如服務器停止)
- 場景:
- 加載數據庫驅動或初始化連接池
- 讀取配置文件
- 執行應用啟動時的初始化任務
- 關閉時釋放全局資源
(2) ServletContextAttributeListener
- 作用:監聽
ServletContext
屬性(應用作用域屬性)的增刪改。 - 方法:
attributeAdded(ServletContextAttributeEvent event) attributeRemoved(ServletContextAttributeEvent event) attributeReplaced(ServletContextAttributeEvent event)
- 場景:
- 跟蹤應用級配置參數的變更
- 記錄全局屬性的修改日志
2. 會話級監聽器
(3) HttpSessionListener
- 作用:監聽
HttpSession
(用戶會話)的創建和銷毀。 - 方法:
sessionCreated(HttpSessionEvent se) // 用戶首次訪問時觸發 sessionDestroyed(HttpSessionEvent se) // 會話超時或手動銷毀時觸發
- 場景:
- 統計在線用戶數
- 記錄會話生命周期
- 清理會話相關的臨時數據
(4) HttpSessionAttributeListener
- 作用:監聽
HttpSession
屬性(會話作用域屬性)的增刪改。 - 方法:
attributeAdded(HttpSessionBindingEvent event) attributeRemoved(HttpSessionBindingEvent event) attributeReplaced(HttpSessionBindingEvent event)
- 場景:
- 監控用戶會話中的關鍵數據變更
- 實現會話屬性的審計功能
(5) HttpSessionBindingListener
- 作用:監聽對象與
HttpSession
的綁定和解除綁定(需對象自身實現該接口)。 - 方法:
valueBound(HttpSessionBindingEvent event) // 對象被添加到會話時觸發 valueUnbound(HttpSessionBindingEvent event) // 對象被移除或會話銷毀時觸發
- 場景:
- 對象級資源管理(如數據庫連接、文件句柄)
- 實現會話綁定的自定義邏輯(如緩存初始化)
3. 請求級監聽器
(6) ServletRequestListener
- 作用:監聽
ServletRequest
(HTTP 請求)的初始化和銷毀。 - 方法:
requestInitialized(ServletRequestEvent sre) // 請求到達時觸發 requestDestroyed(ServletRequestEvent sre) // 請求處理完成時觸發
- 場景:
- 記錄請求開始和結束時間
- 跟蹤請求處理性能
(7) ServletRequestAttributeListener
- 作用:監聽
ServletRequest
屬性(請求作用域屬性)的增刪改。 - 方法:
attributeAdded(ServletRequestAttributeEvent event) attributeRemoved(ServletRequestAttributeEvent event) attributeReplaced(ServletRequestAttributeEvent event)
- 場景:
- 調試請求處理流程中的屬性變化
- 實現請求屬性的審計功能
4. 其他監聽器
(8) HttpSessionActivationListener
(需與鈍化/活化機制配合使用)
- 作用:監聽會話的鈍化(序列化到磁盤)和活化(反序列化回內存)。
- 方法:
sessionWillPassivate(HttpSessionEvent se) // 會話鈍化前觸發 sessionDidActivate(HttpSessionEvent se) // 會話活化后觸發
- 場景:
- 管理會話中需要序列化的對象狀態
- 優化分布式會話的性能
配置方式(以 Servlet 3.0+ 為例)
- 注解配置:
@WebListener public class MyListener implements ServletContextListener {// 實現方法 }
- web.xml 配置:
<listener><listener-class>com.example.MyListener</listener-class> </listener>
注意事項
- 執行順序:監聽器的執行順序由容器決定,避免依賴特定順序。
- 性能影響:避免在監聽器中執行耗時操作,以免阻塞事件處理線程。
- 線程安全:監聽器方法可能由多線程并發調用,需保證線程安全。
這些監聽器構成了 Servlet 事件驅動模型的核心,靈活利用它們可以實現應用狀態監控、資源管理和審計等功能。
3?? 參考 3
以下是 Java Servlet 中所有監聽器(Listener)的分類及其用途的詳細說明:
一、按監聽對象分類
Servlet 監聽器主要針對以下三個域對象的生命周期和屬性變化進行監聽:
- ServletContext(應用域)
- HttpSession(會話域)
- ServletRequest(請求域)
二、監聽器類型及接口
1. 監聽域對象的創建和銷毀
域對象 | 監聽器接口 | 事件觸發時機 | 接口方法 |
---|---|---|---|
ServletContext | ServletContextListener | Web應用啟動/關閉時 | contextInitialized() contextDestroyed() |
HttpSession | HttpSessionListener | 會話創建/銷毀時 | sessionCreated() sessionDestroyed() |
ServletRequest | ServletRequestListener | 請求創建/銷毀時 | requestInitialized() requestDestroyed() |
2. 監聽域對象屬性的增刪改
域對象 | 監聽器接口 | 事件觸發時機 | 接口方法 |
---|---|---|---|
ServletContext | ServletContextAttributeListener | 應用域屬性添加/刪除/替換時 | attributeAdded() attributeRemoved() attributeReplaced() |
HttpSession | HttpSessionAttributeListener | 會話域屬性添加/刪除/替換時 | attributeAdded() attributeRemoved() attributeReplaced() |
ServletRequest | ServletRequestAttributeListener | 請求域屬性添加/刪除/替換時 | attributeAdded() attributeRemoved() attributeReplaced() |
3. 監聽綁定到 HttpSession 對象的狀態變化
接口名稱 | 用途 | 實現方式(需對象自身實現) | 接口方法 |
---|---|---|---|
HttpSessionBindingListener | 監聽對象與會話的綁定/解綁 | 對象需實現此接口 | valueBound() valueUnbound() |
HttpSessionActivationListener | 監聽會話的鈍化(序列化)和活化(反序列化) | 對象需實現此接口 | sessionWillPassivate() sessionDidActivate() |
三、核心接口詳解
1. ServletContextListener
- 用途:監聽應用域(
ServletContext
)的創建和銷毀。 - 典型場景:應用啟動時初始化全局資源(如數據庫連接池),關閉時釋放資源。
- 示例代碼:
@WebListener public class AppContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// 應用啟動時執行sce.getServletContext().setAttribute("onlineCount", 0);}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// 應用關閉時執行// 釋放資源} }
2. HttpSessionListener
- 用途:監聽會話的創建和銷毀。
- 典型場景:統計在線用戶數量。
- 示例代碼:
@WebListener public class SessionListener implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {// 會話創建時增加在線人數ServletContext context = se.getSession().getServletContext();int count = (int) context.getAttribute("onlineCount");context.setAttribute("onlineCount", count + 1);}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {// 會話銷毀時減少在線人數ServletContext context = se.getSession().getServletContext();int count = (int) context.getAttribute("onlineCount");context.setAttribute("onlineCount", count - 1);} }
3. HttpSessionAttributeListener
- 用途:監聽會話域屬性的增刪改。
- 典型場景:監控敏感數據的修改(如用戶權限變化)。
- 示例代碼:
@WebListener public class SessionAttributeListener implements HttpSessionAttributeListener {@Overridepublic void attributeAdded(HttpSessionBindingEvent event) {System.out.println("屬性 [" + event.getName() + "] 被添加到會話");}@Overridepublic void attributeRemoved(HttpSessionBindingEvent event) {System.out.println("屬性 [" + event.getName() + "] 被移出會話");}@Overridepublic void attributeReplaced(HttpSessionBindingEvent event) {System.out.println("屬性 [" + event.getName() + "] 被替換");} }
4. HttpSessionBindingListener
- 用途:監聽對象與會話的綁定/解綁。
- 實現方式:需在對象類中直接實現此接口。
- 典型場景:對象被加入/移出會話時執行清理或初始化操作。
- 示例代碼:
public class User implements HttpSessionBindingListener {@Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println("用戶被綁定到會話");// 初始化操作}@Overridepublic void valueUnbound(HttpSessionBindingEvent event) {System.out.println("用戶從會話解綁");// 釋放資源} }
四、監聽器注冊方式
-
通過注解(Servlet 3.0+):
@WebListener public class MyListener implements ServletContextListener { ... }
-
通過
web.xml
配置:<listener><listener-class>com.example.MyListener</listener-class> </listener>
五、總結
監聽對象 | 監聽類型 | 對應接口 | 觸發時機 |
---|---|---|---|
ServletContext | 創建/銷毀 | ServletContextListener | 應用啟動/關閉 |
屬性變化 | ServletContextAttributeListener | 屬性添加/刪除/替換 | |
HttpSession | 創建/銷毀 | HttpSessionListener | 會話創建/銷毀 |
屬性變化 | HttpSessionAttributeListener | 會話屬性添加/刪除/替換 | |
對象綁定/解綁 | HttpSessionBindingListener | 對象被加入/移出會話 | |
鈍化/活化(序列化) | HttpSessionActivationListener | 會話鈍化(存儲)/活化(恢復) | |
ServletRequest | 創建/銷毀 | ServletRequestListener | 請求創建/銷毀 |
屬性變化 | ServletRequestAttributeListener | 請求屬性添加/刪除/替換 |
六、常見應用場景
- 資源管理:如數據庫連接、文件句柄的自動釋放(通過
valueUnbound
或sessionDestroyed
)。 - 在線人數統計:通過
sessionCreated
和sessionDestroyed
維護計數器。 - 單點登錄(SSO):在
valueBound
中檢查并強制下線重復登錄的用戶。 - 日志記錄:監控敏感操作(如會話屬性的修改)。
通過合理使用這些監聽器,可以更高效地管理 Web 應用的生命周期和狀態變化。
4?? 參考 4
在 Java Servlet 規范里,監聽器(Listener)屬于 Servlet 組件,其用途是對 Servlet 容器里的特定事件進行監聽,當事件發生時執行相應的操作。Java Servlet 主要提供了以下幾類監聽器:
1. 針對 ServletContext
的監聽器
ServletContext
代表整個 Web 應用,這些監聽器用于監聽其生命周期和屬性變化。
ServletContextListener
- 功能:監聽
ServletContext
對象的創建和銷毀。 - 應用場景:可在 Web 應用啟動時進行初始化操作,如加載配置文件、初始化數據庫連接池;在 Web 應用關閉時進行清理操作,如關閉數據庫連接池。
- 示例代碼:
- 功能:監聽
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;@WebListener
public class MyServletContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("Web 應用啟動");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("Web 應用關閉");}
}
ServletContextAttributeListener
- 功能:監聽
ServletContext
對象中屬性的添加、移除和替換。 - 應用場景:記錄屬性變化日志、更新全局緩存等。
- 示例代碼:
- 功能:監聽
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;@WebListener
public class MyServletContextAttributeListener implements ServletContextAttributeListener {@Overridepublic void attributeAdded(ServletContextAttributeEvent event) {System.out.println("添加屬性: " + event.getName());}@Overridepublic void attributeRemoved(ServletContextAttributeEvent event) {System.out.println("移除屬性: " + event.getName());}@Overridepublic void attributeReplaced(ServletContextAttributeEvent event) {System.out.println("替換屬性: " + event.getName());}
}
2. 針對 HttpSession
的監聽器
HttpSession
代表用戶會話,這些監聽器用于監聽會話的生命周期和屬性變化。
HttpSessionListener
- 功能:監聽
HttpSession
對象的創建和銷毀。 - 應用場景:統計在線用戶數量、記錄用戶登錄和退出時間。
- 示例代碼:
- 功能:監聽
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.annotation.WebListener;@WebListener
public class MyHttpSessionListener implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("會話創建: " + se.getSession().getId());}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {System.out.println("會話銷毀: " + se.getSession().getId());}
}
HttpSessionAttributeListener
- 功能:監聽
HttpSession
對象中屬性的添加、移除和替換。 - 應用場景:記錄會話屬性變化日志、更新用戶會話狀態。
- 示例代碼:
- 功能:監聽
import javax.servlet.http.HttpSessionAttributeEvent;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.annotation.WebListener;@WebListener
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {@Overridepublic void attributeAdded(HttpSessionAttributeEvent event) {System.out.println("會話添加屬性: " + event.getName());}@Overridepublic void attributeRemoved(HttpSessionAttributeEvent event) {System.out.println("會話移除屬性: " + event.getName());}@Overridepublic void attributeReplaced(HttpSessionAttributeEvent event) {System.out.println("會話替換屬性: " + event.getName());}
}
HttpSessionBindingListener
- 功能:允許對象自身感知其何時被綁定到
HttpSession
以及何時從HttpSession
中解綁。 - 應用場景:當對象綁定或解綁會話時執行特定操作,如資源分配和釋放。
- 示例代碼:
- 功能:允許對象自身感知其何時被綁定到
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;public class User implements HttpSessionBindingListener {private String name;public User(String name) {this.name = name;}@Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println(name + " 綁定到會話");}@Overridepublic void valueUnbound(HttpSessionBindingEvent event) {System.out.println(name + " 從會話解綁");}
}
HttpSessionActivationListener
- 功能:監聽
HttpSession
對象的鈍化(序列化到磁盤)和活化(從磁盤反序列化)。 - 應用場景:在會話鈍化和活化時進行資源管理。
- 示例代碼:
- 功能:監聽
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
import java.io.Serializable;public class MySessionActivationListener implements HttpSessionActivationListener, Serializable {@Overridepublic void sessionWillPassivate(HttpSessionEvent se) {System.out.println("會話將鈍化: " + se.getSession().getId());}@Overridepublic void sessionDidActivate(HttpSessionEvent se) {System.out.println("會話已活化: " + se.getSession().getId());}
}
3. 針對 ServletRequest
的監聽器
ServletRequest
代表客戶端請求,這些監聽器用于監聽請求的生命周期和屬性變化。
ServletRequestListener
- 功能:監聽
ServletRequest
對象的創建和銷毀。 - 應用場景:記錄請求處理時間、統計請求數量。
- 示例代碼:
- 功能:監聽
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;@WebListener
public class MyServletRequestListener implements ServletRequestListener {@Overridepublic void requestInitialized(ServletRequestEvent sre) {System.out.println("請求初始化");}@Overridepublic void requestDestroyed(ServletRequestEvent sre) {System.out.println("請求銷毀");}
}
ServletRequestAttributeListener
- 功能:監聽
ServletRequest
對象中屬性的添加、移除和替換。 - 應用場景:記錄請求屬性變化日志、進行數據驗證。
- 示例代碼:
- 功能:監聽
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.annotation.WebListener;@WebListener
public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {@Overridepublic void attributeAdded(ServletRequestAttributeEvent srae) {System.out.println("請求添加屬性: " + srae.getName());}@Overridepublic void attributeRemoved(ServletRequestAttributeEvent srae) {System.out.println("請求移除屬性: " + srae.getName());}@Overridepublic void attributeReplaced(ServletRequestAttributeEvent srae) {System.out.println("請求替換屬性: " + srae.getName());}
}
這些監聽器可以通過 @WebListener
注解或者在 web.xml
文件中進行配置。
5?? 參考 5
Java Servlet 提供了多種監聽器(Listener),用于監聽 Web 應用程序中的各種事件。以下是常見的監聽器及其用途:
1. ServletContext 相關監聽器
ServletContextListener
:監聽ServletContext
的創建和銷毀事件。contextInitialized(ServletContextEvent sce)
:在ServletContext
初始化時調用。contextDestroyed(ServletContextEvent sce)
:在ServletContext
銷毀時調用。
ServletContextAttributeListener
:監聽ServletContext
屬性的添加、刪除和替換事件。attributeAdded(ServletContextAttributeEvent event)
:屬性被添加時調用。attributeRemoved(ServletContextAttributeEvent event)
:屬性被刪除時調用。attributeReplaced(ServletContextAttributeEvent event)
:屬性被替換時調用。
2. HttpSession 相關監聽器
HttpSessionListener
:監聽HttpSession
的創建和銷毀事件。sessionCreated(HttpSessionEvent se)
:會話創建時調用。sessionDestroyed(HttpSessionEvent se)
:會話銷毀時調用。
HttpSessionAttributeListener
:監聽HttpSession
屬性的添加、刪除和替換事件。attributeAdded(HttpSessionBindingEvent event)
:屬性被添加時調用。attributeRemoved(HttpSessionBindingEvent event)
:屬性被刪除時調用。attributeReplaced(HttpSessionBindingEvent event)
:屬性被替換時調用。
HttpSessionBindingListener
:監聽綁定到HttpSession
的對象的狀態變化。valueBound(HttpSessionBindingEvent event)
:對象被綁定到會話時調用。valueUnbound(HttpSessionBindingEvent event)
:對象從會話中移除時調用。
HttpSessionActivationListener
:監聽HttpSession
的鈍化和活化事件。sessionWillPassivate(HttpSessionEvent se)
:會話鈍化前調用。sessionDidActivate(HttpSessionEvent se)
:會話活化后調用。
3. ServletRequest 相關監聽器
ServletRequestListener
:監聽ServletRequest
的創建和銷毀事件。requestInitialized(ServletRequestEvent sre)
:請求初始化時調用。requestDestroyed(ServletRequestEvent sre)
:請求銷毀時調用。
ServletRequestAttributeListener
:監聽ServletRequest
屬性的添加、刪除和替換事件。attributeAdded(ServletRequestAttributeEvent event)
:屬性被添加時調用。attributeRemoved(ServletRequestAttributeEvent event)
:屬性被刪除時調用。attributeReplaced(ServletRequestAttributeEvent event)
:屬性被替換時調用。
4. 其他監聽器
AsyncListener
:監聽異步操作的完成、超時或失敗事件。
這些監聽器可以通過實現相應的接口來創建,并通過在 web.xml
文件中配置或使用 @WebListener
注解來注冊。
6?? 參考 6
Java的Servlet API提供了多種監聽器(Listener),用于監聽Web應用中的各種事件。以下是一些常見的Servlet監聽器:
1. ServletContextListener
- 作用:監聽整個Web應用的啟動和銷毀事件。
- 使用場景:初始化全局資源,如數據庫連接池、日志系統等。
2. ServletContextAttributeListener
- 作用:監聽ServletContext中屬性的添加、移除和替換事件。
- 使用場景:跟蹤全局屬性的變化。
3. HttpSessionListener
- 作用:監聽HttpSession的創建和銷毀事件。
- 使用場景:統計在線用戶數,管理會話超時等。
4. HttpSessionAttributeListener
- 作用:監聽HttpSession中屬性的添加、移除和替換事件。
- 使用場景:跟蹤會話屬性的變化。
5. ServletRequestListener
- 作用:監聽ServletRequest的創建和銷毀事件。
- 使用場景:記錄請求日志,管理請求資源等。
6. ServletRequestAttributeListener
- 作用:監聽ServletRequest中屬性的添加、移除和替換事件。
- 使用場景:跟蹤請求屬性的變化。
7. HttpSessionBindingListener
- 作用:監聽對象綁定到HttpSession和從HttpSession解綁的事件。
- 使用場景:在對象綁定和解綁時執行特定操作,如資源初始化和清理。
8. HttpSessionActivationListener
- 作用:監聽HttpSession的激活和鈍化事件(主要用于分布式環境中的會話管理)。
- 使用場景:在會話被鈍化(序列化到磁盤)和激活(從磁盤反序列化)時執行操作。
9. SingleSignOnListener(較少使用)
- 作用:監聽單點登錄相關的事件。
- 使用場景:在單點登錄系統中跟蹤用戶的登錄狀態變化。
注冊監聽器的方式
監聽器可以通過以下兩種方式注冊:
- 在
web.xml
文件中配置:<listener><listener-class>com.example.MyListener</listener-class> </listener>
- 使用注解(適用于Servlet 3.0及以上版本):
import javax.servlet.annotation.WebListener;@WebListener public class MyListener implements ServletContextListener {// 實現相應的方法 }
通過合理使用這些監聽器,可以更好地管理和控制Web應用的行為,提高應用的靈活性和可維護性。
7?? 參考 7
Java Servlet 監聽器類型詳解
Java Servlet 監聽器(Listener)主要用于監聽 Web 應用中的容器級事件和對象狀態變化,根據監聽目標可分為以下三類六種核心類型,涵蓋容器生命周期、會話管理、請求處理等場景。
一、Servlet 上下文監聽器(ServletContext)
1. ServletContextListener
- 功能:監聽 Web 應用的初始化與銷毀
- 方法:
void contextInitialized(ServletContextEvent sce); // 應用啟動時觸發 void contextDestroyed(ServletContextEvent sce); // 應用關閉時觸發
- 典型應用:
- 加載全局配置(如數據庫連接池)
- 釋放應用級資源(如關閉線程池)
public class AppInitListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("應用啟動,加載配置文件");} }
2. ServletContextAttributeListener
- 功能:監聽上下文(
ServletContext
)的屬性變化 - 方法:
void attributeAdded(ServletContextAttributeEvent scae); // 屬性添加 void attributeRemoved(ServletContextAttributeEvent scae); // 屬性移除 void attributeReplaced(ServletContextAttributeEvent scae); // 屬性修改
- 典型應用:
- 全局配置變更審計
- 動態刷新緩存
二、會話監聽器(HttpSession)
1. HttpSessionListener
- 功能:監聽會話(Session)的創建與銷毀
- 方法:
void sessionCreated(HttpSessionEvent se); // 會話創建時觸發 void sessionDestroyed(HttpSessionEvent se);// 會話銷毀時觸發
- 典型應用:
- 統計在線用戶數
public class SessionCounter implements HttpSessionListener {private static int activeSessions = 0;@Overridepublic void sessionCreated(HttpSessionEvent se) {activeSessions++;} }
2. HttpSessionAttributeListener
- 功能:監聽會話屬性變化(所有屬性)
- 方法:
void attributeAdded(HttpSessionBindingEvent se); // 屬性添加 void attributeRemoved(HttpSessionBindingEvent se); // 屬性移除 void attributeReplaced(HttpSessionBindingEvent se); // 屬性修改
- 對比:
- 與
HttpSessionBindingListener
不同,此接口獨立于被存儲對象,可監聽所有會話屬性。
- 與
3. HttpSessionActivationListener
- 功能:監聽會話的序列化(鈍化)與反序列化(活化),用于分布式會話
- 方法:
void sessionWillPassivate(HttpSessionEvent se); // 會話鈍化前觸發 void sessionDidActivate(HttpSessionEvent se); // 會話活化后觸發
- 典型應用:
- 釋放/重建非序列化資源(如文件句柄)
三、請求監聽器(ServletRequest)
1. ServletRequestListener
- 功能:監聽 HTTP 請求的初始化和銷毀
- 方法:
void requestInitialized(ServletRequestEvent sre); // 請求到達時觸發 void requestDestroyed(ServletRequestEvent sre); // 請求處理完畢時觸發
- 典型應用:
- 記錄請求耗時
public class RequestTimer implements ServletRequestListener {@Overridepublic void requestInitialized(ServletRequestEvent sre) {sre.getServletRequest().setAttribute("startTime", System.currentTimeMillis());} }
2. ServletRequestAttributeListener
- 功能:監聽請求屬性變化
- 方法:
void attributeAdded(ServletRequestAttributeEvent srae); // 屬性添加 void attributeRemoved(ServletRequestAttributeEvent srae); // 屬性移除 void attributeReplaced(ServletRequestAttributeEvent srae); // 屬性修改
四、特殊對象綁定監聽器
HttpSessionBindingListener
- 功能:由被存儲對象自身實現,監聽自身與 Session 的綁定/解綁事件(如
session.setAttribute("key", obj)
) - 方法:
void valueBound(HttpSessionBindingEvent event); // 綁定到 Session 時觸發 void valueUnbound(HttpSessionBindingEvent event); // 從 Session 移除時觸發
- 特點:
- 無需注冊,自動觸發
- 適用于對象級生命周期管理(如自動釋放資源)。
監聽器對比表
類型 | 監聽目標 | 是否需要注冊 | 典型場景 |
---|---|---|---|
ServletContextListener | Web 應用生命周期 | 是 | 全局資源配置 |
HttpSessionListener | 會話創建/銷毀 | 是 | 在線用戶統計 |
HttpSessionBindingListener | 對象綁定事件 | 否 | 對象級資源管理 |
ServletRequestAttributeListener | 請求屬性變化 | 是 | 請求參數審計 |
配置方式
-
注解配置(Servlet 3.0+)
@WebListener public class MyListener implements ServletContextListener { ... }
-
web.xml 配置
<listener><listener-class>com.example.AppInitListener</listener-class> </listener>
相關問題
- 如何通過
HttpSessionActivationListener
實現分布式會話的數據一致性? - 在 Spring Boot 中如何整合自定義的 Servlet 監聽器?
HttpSessionAttributeListener
和HttpSessionBindingListener
的事件觸發順序是怎樣的?
8?? 參考 8
Java Servlet 規范中定義了 8 類監聽器,主要用于監聽 Servlet 三大域對象(ServletContext、HttpSession、ServletRequest) 的生命周期、屬性變化及會話綁定操作。以下是分類詳解及核心接口說明:
一、生命周期監聽器
監聽域對象的 創建與銷毀 事件:
-
ServletContextListener
? 作用:監聽 Web 應用的啟動(contextInitialized
)和關閉(contextDestroyed
)事件。
? 典型應用:初始化數據庫連接池、加載全局配置文件。@WebListener public class AppListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("Web應用啟動");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("Web應用關閉");} }
-
HttpSessionListener
? 作用:監聽會話的創建(sessionCreated
)和銷毀(sessionDestroyed
)。
? 典型應用:統計在線用戶數,記錄會話超時日志。@WebListener public class SessionTracker implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("新會話創建:" + se.getSession().getId());} }
-
ServletRequestListener
? 作用:監聽請求的初始化(requestInitialized
)和結束(requestDestroyed
)。
? 典型應用:記錄請求耗時、統計 API 調用量。
二、屬性變化監聽器
監聽域對象中 屬性的增刪改 事件:
4. ServletContextAttributeListener
? 作用:監聽 ServletContext
屬性的增刪改。
? 典型應用:動態刷新全局配置(如切換日志級別)。
-
HttpSessionAttributeListener
? 作用:監聽HttpSession
屬性的增刪改。
? 典型應用:用戶權限變更時實時更新權限緩存。 -
ServletRequestAttributeListener
? 作用:監聽ServletRequest
屬性的增刪改。
? 典型應用:校驗請求參數合法性(如敏感詞過濾)。
三、會話綁定與鈍活化監聽器
監聽 會話中對象的綁定狀態 和 序列化行為:
7. HttpSessionBindingListener
? 作用:對象感知自身被綁定到會話(valueBound
)或解綁(valueUnbound
)。
? 特點:無需配置,由對象自身實現接口。
public class User implements HttpSessionBindingListener {@Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println("用戶綁定到Session");}
}
HttpSessionActivationListener
? 作用:監聽對象隨會話 鈍化(持久化到磁盤) 和 活化(加載到內存) 的過程。
? 依賴:需配合Serializable
接口實現序列化。
四、其他擴展監聽器(Servlet 3.0+)
AsyncListener
? 作用:監聽異步請求的完成、超時或錯誤事件。
? 典型應用:處理長時間任務(如文件上傳進度跟蹤)。
五、配置方式
? 注解:使用 @WebListener
標記監聽器類(Servlet 3.0+)。
? XML:在 web.xml
中添加 <listener>
標簽。
<listener><listener-class>com.example.MyListener</listener-class>
</listener>
引用說明
:八大監聽器分類及核心接口定義。
:配置方式及典型應用場景。
:擴展監聽器 AsyncListener
的作用。
9?? 參考 9
在 Java 的 Servlet API 中,監聽器(Listener)用于監聽 Web 應用中對象的生命周期和狀態變化。以下是 Servlet 監聽器的主要類型及其用途的分類總結:
一、應用(ServletContext)監聽器
監聽 Web 應用的生命周期 和 應用級屬性變化:
-
ServletContextListener
- 用途:監聽整個 Web 應用的啟動和關閉。
- 方法:
contextInitialized(ServletContextEvent event)
:應用啟動時觸發。contextDestroyed(ServletContextEvent event)
:應用關閉時觸發。
- 典型場景:初始化全局資源(如數據庫連接池)、加載配置文件、記錄應用啟動日志。
-
ServletContextAttributeListener
- 用途:監聽
ServletContext
(應用級)屬性的增刪改事件。 - 方法:
attributeAdded
:屬性添加時觸發。attributeRemoved
:屬性刪除時觸發。attributeReplaced
:屬性值被替換時觸發。
- 典型場景:監控全局配置變化、記錄屬性操作日志。
- 用途:監聽
二、會話(HttpSession)監聽器
監聽 用戶會話的生命周期 和 會話屬性變化:
-
HttpSessionListener
- 用途:監聽會話的創建和銷毀。
- 方法:
sessionCreated(HttpSessionEvent event)
:會話創建時觸發(如用戶首次訪問需會話的資源)。sessionDestroyed(HttpSessionEvent event)
:會話銷毀時觸發(如超時、調用invalidate()
)。
- 典型場景:統計在線用戶數、記錄用戶登錄/下線時間、釋放會話資源。
-
HttpSessionAttributeListener
- 用途:監聽
HttpSession
(會話級)屬性的增刪改事件。 - 方法:
attributeAdded
:屬性添加時觸發。attributeRemoved
:屬性刪除時觸發。attributeReplaced
:屬性值被替換時觸發。
- 典型場景:監控用戶狀態變化(如購物車更新)、同步緩存數據。
- 用途:監聽
-
HttpSessionBindingListener
- 用途:由 對象自身 實現,監聽對象被綁定到會話或解除綁定的事件。
- 方法:
valueBound(HttpSessionBindingEvent event)
:對象被綁定到會話時觸發。valueUnbound(HttpSessionBindingEvent event)
:對象從會話中解除綁定時觸發。
- 典型場景:在對象綁定時初始化資源(如數據庫連接),解除綁定時釋放資源。
-
HttpSessionActivationListener
- 用途:在 分布式會話 場景下,監聽會話鈍化(序列化到磁盤)和激活(反序列化到內存)事件。
- 方法:
sessionDidActivate(HttpSessionEvent event)
:會話激活時觸發。sessionWillPassivate(HttpSessionEvent event)
:會話鈍化前觸發。
- 典型場景:在會話遷移時清理非序列化字段(如線程局部變量)。
三、請求(ServletRequest)監聽器
監聽 單個 HTTP 請求的生命周期 和 請求屬性變化:
-
ServletRequestListener
- 用途:監聽單個請求的創建和銷毀。
- 方法:
requestInitialized(ServletRequestEvent event)
:請求創建時觸發。requestDestroyed(ServletRequestEvent event)
:請求銷毀時觸發。
- 典型場景:記錄請求開始/結束時間、統計請求耗時。
-
ServletRequestAttributeListener
- 用途:監聽
ServletRequest
(請求級)屬性的增刪改事件。 - 方法:
attributeAdded
:屬性添加時觸發。attributeRemoved
:屬性刪除時觸發。attributeReplaced
:屬性值被替換時觸發。
- 典型場景:監控請求參數變化、記錄屬性操作日志。
- 用途:監聽
四、其他監聽器
ServletRequestListener
和HttpSessionListener
的子類:- 例如
AsyncListener
(用于異步請求監聽),但屬于更高級的用法。
- 例如
監聽器的配置方式
- 方式 1:通過注解(Servlet 3.0+):
在監聽器類上添加@WebListener
注解,無需額外配置。 - 方式 2:在
web.xml
中聲明:<listener><listener-class>com.example.MyListener</listener-class> </listener>
總結表格
監聽器類型 | 監聽對象 | 主要用途 | 核心方法 |
---|---|---|---|
ServletContextListener | 應用(ServletContext) | 應用的啟動和關閉 | contextInitialized() , contextDestroyed() |
ServletContextAttributeListener | 應用屬性 | 監控應用級屬性變化 | attributeAdded() , attributeRemoved() , attributeReplaced() |
HttpSessionListener | 會話(HttpSession) | 會話的創建和銷毀 | sessionCreated() , sessionDestroyed() |
HttpSessionAttributeListener | 會話屬性 | 監控會話級屬性變化 | attributeAdded() , attributeRemoved() , attributeReplaced() |
HttpSessionBindingListener | 對象綁定到會話 | 對象被綁定或解除綁定到會話 | valueBound() , valueUnbound() |
HttpSessionActivationListener | 會話鈍化/激活 | 分布式會話的鈍化和激活事件 | sessionDidActivate() , sessionWillPassivate() |
ServletRequestListener | 請求(ServletRequest) | 請求的創建和銷毀 | requestInitialized() , requestDestroyed() |
ServletRequestAttributeListener | 請求屬性 | 監控請求級屬性變化 | attributeAdded() , attributeRemoved() , attributeReplaced() |
Java的Servlet監聽器(Listener)是Java Servlet規范中定義的一種特殊類,它可以監聽Web應用程序中的特定事件,并在這些事件發生時執行相應的處理[1]。Servlet監聽器主要包括以下幾種:
-
ServletContextListener
- 功能描述:用于監聽ServletContext對象的創建和銷毀事件。當Web應用啟動時,容器會自動創建一個ServletContext對象,并調用實現該接口類的contextInitialized方法;當Web應用停止時,容器會調用contextDestroyed方法。
- 應用場景:在contextInitialized方法中可以進行一些初始化操作,如加載配置文件、初始化數據庫連接池等;在contextDestroyed方法中可以進行清理工作,如釋放資源、關閉數據庫連接等。
-
HttpSessionListener
- 功能描述:用于監聽HttpSession對象的創建和銷毀事件。當一個HttpSession被創建時,容器會調用實現該接口類的sessionCreated方法;當一個HttpSession被銷毀時,容器會調用sessionDestroyed方法。
- 應用場景:在sessionCreated方法中可以記錄用戶的登錄信息、初始化用戶的會話數據等;在sessionDestroyed方法中可以進行清理工作,如移除用戶在服務器上的緩存數據等。
-
ServletRequestListener
- 功能描述:用于監聽ServletRequest對象的初始化和結束事件。當一個請求被創建時,容器會調用實現該接口類的requestInitialized方法;當一個請求結束時,容器會調用requestDestroyed方法。
- 應用場景:可以在requestInitialized方法中進行請求的預處理,如檢查用戶的權限、記錄請求的日志等;在requestDestroyed方法中可以進行請求的后處理,如釋放資源、統計請求的處理時間等。
-
HttpSessionAttributeListener
- 功能描述:用于監聽HttpSession對象中屬性的增加、刪除和替換事件。當一個屬性被添加到HttpSession中時,容器會調用實現該接口類的attributeAdded方法;當一個屬性從HttpSession中刪除時,容器會調用attributeRemoved方法;當一個屬性在HttpSession中被替換時,容器會調用attributeReplaced方法。
- 應用場景:可以在attributeAdded方法中對新添加的屬性進行處理,如驗證屬性的值、更新相關的業務數據等;在attributeRemoved方法中可以清理與屬性相關的資源;在attributeReplaced方法中可以處理屬性值的變化,如觸發相關的業務邏輯。
-
ServletRequestAttributeListener
- 功能描述:用于監聽ServletRequest對象中屬性的增加、刪除和替換事件。當一個屬性被添加到ServletRequest中時,容器會調用實現該接口類的attributeAdded方法;當一個屬性從ServletRequest中刪除時,容器會調用attributeRemoved方法;當一個屬性在ServletRequest中被替換時,容器會調用attributeReplaced方法。
- 應用場景:與HttpSessionAttributeListener類似,可以在attributeAdded、attributeRemoved和attributeReplaced方法中對ServletRequest中的屬性變化進行處理,以滿足特定的業務需求。
-
HttpSessionBindingListener
- 功能描述:用于監聽對象與HttpSession綁定和解除綁定的事件。當一個實現了該接口的對象被綁定到HttpSession中時,容器會調用valueBound方法;當該對象從HttpSession中解綁時,容器會調用valueUnbound方法。
- 應用場景:可以在valueBound方法中執行對象與HttpSession綁定時的初始化操作,如將對象的狀態設置為已綁定等;在valueUnbound方法中可以進行清理工作,如釋放對象占用的資源等。
-
HttpSessionActivationListener
- 功能描述:用于監聽HttpSession的活化和鈍化事件。當一個HttpSession被激活時(即客戶端恢復與服務器的交互),容器會調用實現該接口類的sessionWillActivate方法;當一個HttpSession被鈍化時(即客戶端長時間未與服務器交互),容器會調用sessionDidPassivate方法。
- 應用場景:可以在sessionWillActivate方法中進行一些操作,如重新建立與后端系統的連接等;在sessionDidPassivate方法中可以將HttpSession中的數據持久化到存儲設備中,以便在會話恢復時能夠快速恢復數據。
🔟 參考 10
Java Servlet 監聽器(Listener)用于監聽 Web 應用中關鍵對象(如 ServletContext
、HttpSession
、ServletRequest
)的生命周期和屬性變化,共分為 8 種類型,按功能分類如下:
一、監聽對象創建與銷毀
監聽器接口 | 作用 | 觸發方法 | 來源 |
---|---|---|---|
ServletContextListener | 監聽 ServletContext (應用級作用域)的創建和銷毀,如應用啟動/關閉時觸發 | contextInitialized() 、contextDestroyed() | |
HttpSessionListener | 監聽 HttpSession (會話級作用域)的創建和銷毀,如用戶登錄/退出或 Session 超時 | sessionCreated() 、sessionDestroyed() | |
ServletRequestListener | 監聽 ServletRequest (請求級作用域)的創建和銷毀,如每次請求到達服務器時觸發 | requestInitialized() 、requestDestroyed() |
二、監聽對象屬性變化
監聽器接口 | 作用 | 觸發方法 | 來源 |
---|---|---|---|
ServletContextAttributeListener | 監聽 ServletContext 屬性的添加、修改、刪除 | attributeAdded() 、attributeReplaced() 、attributeRemoved() | |
HttpSessionAttributeListener | 監聽 HttpSession 屬性的添加、修改、刪除 | 同上 | |
ServletRequestAttributeListener | 監聽 ServletRequest 屬性的添加、修改、刪除 | 同上 |
三、監聽 Session 對象綁定與鈍化
監聽器接口 | 作用 | 觸發方法 | 來源 |
---|---|---|---|
HttpSessionBindingListener | 監聽對象綁定到 Session 或從 Session 解綁(需對象實現該接口) | valueBound() 、valueUnbound() | |
HttpSessionActivationListener | 監聽 Session 的鈍化(內存持久化到硬盤)和活化(硬盤加載到內存)(需對象序列化) | sessionWillPassivate() 、sessionDidActivate() |
四、典型應用場景
- 初始化資源
ServletContextListener
:應用啟動時初始化數據庫連接池或加載全局配置 。
- 統計在線用戶
HttpSessionListener
:通過sessionCreated()
和sessionDestroyed()
統計活躍會話數 。
- 請求日志記錄
ServletRequestListener
:記錄請求開始和結束時間,計算耗時 。
- 用戶登錄狀態管理
HttpSessionBindingListener
:用戶登錄時綁定對象到 Session,退出時釋放資源 。
- 分布式會話同步
HttpSessionActivationListener
:在集群環境中同步 Session 數據 。
五、配置方式
- 注解:在監聽器類上添加
@WebListener
(推薦)。 - XML:在
web.xml
中配置<listener>
標簽 。
總結
Servlet 監聽器通過監聽 對象生命周期 和 屬性變化,實現資源管理、日志記錄、會話跟蹤等核心功能。根據監聽對象不同,分為 應用級、會話級 和 請求級 三類,開發者可根據需求選擇合適的監聽器類型。