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 监听器通过监听 对象生命周期 和 属性变化,实现资源管理、日志记录、会话跟踪等核心功能。根据监听对象不同,分为 应用级、会话级 和 请求级 三类,开发者可根据需求选择合适的监听器类型。