Java的Servlet的监听器Listener 笔记250417

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请求属性增删改流程跟踪、动态校验

五、注意事项

  1. 线程安全

    • ServletContextHttpSession 中的共享资源需确保线程安全(如使用 AtomicInteger 或同步锁)。
    • ServletRequest 是线程局部的,无需额外同步。
  2. 性能影响

    • 避免在监听器中执行耗时操作(如复杂计算、同步 I/O)。
    • 高频事件(如请求属性变更)需优化监听逻辑。
  3. 递归调用

    • 在监听器中修改同一作用域的属性可能导致循环触发事件。
  4. 分布式环境

    • 会话监听器需处理序列化问题(如实现 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 {// 实现方法
}

四、注意事项

  1. 线程安全

    • ServletContextHttpSession 中的共享资源需线程安全(如用 AtomicInteger)。
    • ServletRequest 是线程局部的,无需同步。
  2. 性能优化

    • 避免在监听器中执行耗时操作(如复杂计算或 I/O)。
    • 高频事件(如请求属性变更)需轻量级处理。
  3. 递归陷阱

    • 在监听器中修改同一作用域的属性可能导致循环触发事件。
  4. 分布式环境

    • 会话监听器需处理序列化(如实现 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+ 为例)

  1. 注解配置
    @WebListener
    public class MyListener implements ServletContextListener {// 实现方法
    }
    
  2. web.xml 配置
    <listener><listener-class>com.example.MyListener</listener-class>
    </listener>
    

注意事项

  • 执行顺序:监听器的执行顺序由容器决定,避免依赖特定顺序。
  • 性能影响:避免在监听器中执行耗时操作,以免阻塞事件处理线程。
  • 线程安全:监听器方法可能由多线程并发调用,需保证线程安全。

这些监听器构成了 Servlet 事件驱动模型的核心,灵活利用它们可以实现应用状态监控、资源管理和审计等功能。










3️⃣ 参考 3

以下是 Java Servlet 中所有监听器(Listener)的分类及其用途的详细说明:


一、按监听对象分类

Servlet 监听器主要针对以下三个域对象的生命周期和属性变化进行监听:

  1. ServletContext(应用域)
  2. HttpSession(会话域)
  3. ServletRequest(请求域)

二、监听器类型及接口

1. 监听域对象的创建和销毁
域对象监听器接口事件触发时机接口方法
ServletContextServletContextListenerWeb应用启动/关闭时contextInitialized()
contextDestroyed()
HttpSessionHttpSessionListener会话创建/销毁时sessionCreated()
sessionDestroyed()
ServletRequestServletRequestListener请求创建/销毁时requestInitialized()
requestDestroyed()
2. 监听域对象属性的增删改
域对象监听器接口事件触发时机接口方法
ServletContextServletContextAttributeListener应用域属性添加/删除/替换时attributeAdded()
attributeRemoved()
attributeReplaced()
HttpSessionHttpSessionAttributeListener会话域属性添加/删除/替换时attributeAdded()
attributeRemoved()
attributeReplaced()
ServletRequestServletRequestAttributeListener请求域属性添加/删除/替换时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("用户从会话解绑");// 释放资源}
    }
    

四、监听器注册方式

  1. 通过注解(Servlet 3.0+)

    @WebListener
    public class MyListener implements ServletContextListener { ... }
    
  2. 通过 web.xml 配置

    <listener><listener-class>com.example.MyListener</listener-class>
    </listener>
    

五、总结

监听对象监听类型对应接口触发时机
ServletContext创建/销毁ServletContextListener应用启动/关闭
属性变化ServletContextAttributeListener属性添加/删除/替换
HttpSession创建/销毁HttpSessionListener会话创建/销毁
属性变化HttpSessionAttributeListener会话属性添加/删除/替换
对象绑定/解绑HttpSessionBindingListener对象被加入/移出会话
钝化/活化(序列化)HttpSessionActivationListener会话钝化(存储)/活化(恢复)
ServletRequest创建/销毁ServletRequestListener请求创建/销毁
属性变化ServletRequestAttributeListener请求属性添加/删除/替换

六、常见应用场景

  1. 资源管理:如数据库连接、文件句柄的自动释放(通过 valueUnboundsessionDestroyed)。
  2. 在线人数统计:通过 sessionCreatedsessionDestroyed 维护计数器。
  3. 单点登录(SSO):在 valueBound 中检查并强制下线重复登录的用户。
  4. 日志记录:监控敏感操作(如会话属性的修改)。

通过合理使用这些监听器,可以更高效地管理 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(较少使用)

  • 作用:监听单点登录相关的事件。
  • 使用场景:在单点登录系统中跟踪用户的登录状态变化。

注册监听器的方式

监听器可以通过以下两种方式注册:

  1. web.xml文件中配置
    <listener><listener-class>com.example.MyListener</listener-class>
    </listener>
    
  2. 使用注解(适用于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 移除时触发
    
  • 特点
    • 无需注册,自动触发
    • 适用于对象级生命周期管理(如自动释放资源)。

监听器对比表

类型监听目标是否需要注册典型场景
ServletContextListenerWeb 应用生命周期全局资源配置
HttpSessionListener会话创建/销毁在线用户统计
HttpSessionBindingListener对象绑定事件对象级资源管理
ServletRequestAttributeListener请求属性变化请求参数审计

配置方式

  1. 注解配置(Servlet 3.0+)

    @WebListener
    public class MyListener implements ServletContextListener { ... }
    
  2. web.xml 配置

    <listener><listener-class>com.example.AppInitListener</listener-class>
    </listener>
    

相关问题

  1. 如何通过 HttpSessionActivationListener 实现分布式会话的数据一致性?
  2. 在 Spring Boot 中如何整合自定义的 Servlet 监听器?
  3. HttpSessionAttributeListenerHttpSessionBindingListener 的事件触发顺序是怎样的?










8️⃣ 参考 8

Java Servlet 规范中定义了 8 类监听器,主要用于监听 Servlet 三大域对象(ServletContext、HttpSession、ServletRequest) 的生命周期、属性变化及会话绑定操作。以下是分类详解及核心接口说明:


一、生命周期监听器

监听域对象的 创建与销毁 事件:

  1. 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应用关闭");}
    }
    
  2. HttpSessionListener
    作用:监听会话的创建(sessionCreated)和销毁(sessionDestroyed)。
    典型应用:统计在线用户数,记录会话超时日志。

    @WebListener
    public class SessionTracker implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("新会话创建:" + se.getSession().getId());}
    }
    
  3. ServletRequestListener
    作用:监听请求的初始化(requestInitialized)和结束(requestDestroyed)。
    典型应用:记录请求耗时、统计 API 调用量。


二、属性变化监听器

监听域对象中 属性的增删改 事件:
4. ServletContextAttributeListener
作用:监听 ServletContext 属性的增删改。
典型应用:动态刷新全局配置(如切换日志级别)。

  1. HttpSessionAttributeListener
    作用:监听 HttpSession 属性的增删改。
    典型应用:用户权限变更时实时更新权限缓存。

  2. ServletRequestAttributeListener
    作用:监听 ServletRequest 属性的增删改。
    典型应用:校验请求参数合法性(如敏感词过滤)。


三、会话绑定与钝活化监听器

监听 会话中对象的绑定状态序列化行为
7. HttpSessionBindingListener
作用:对象感知自身被绑定到会话(valueBound)或解绑(valueUnbound)。
特点:无需配置,由对象自身实现接口。

public class User implements HttpSessionBindingListener {@Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println("用户绑定到Session");}
}
  1. HttpSessionActivationListener
    作用:监听对象随会话 钝化(持久化到磁盘)活化(加载到内存) 的过程。
    依赖:需配合 Serializable 接口实现序列化。

四、其他扩展监听器(Servlet 3.0+)

  1. 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 应用的生命周期应用级属性变化

  1. ServletContextListener

    • 用途:监听整个 Web 应用的启动和关闭。
    • 方法
      • contextInitialized(ServletContextEvent event):应用启动时触发。
      • contextDestroyed(ServletContextEvent event):应用关闭时触发。
    • 典型场景:初始化全局资源(如数据库连接池)、加载配置文件、记录应用启动日志。
  2. ServletContextAttributeListener

    • 用途:监听 ServletContext(应用级)属性的增删改事件。
    • 方法
      • attributeAdded:属性添加时触发。
      • attributeRemoved:属性删除时触发。
      • attributeReplaced:属性值被替换时触发。
    • 典型场景:监控全局配置变化、记录属性操作日志。

二、会话(HttpSession)监听器

监听 用户会话的生命周期会话属性变化

  1. HttpSessionListener

    • 用途:监听会话的创建和销毁。
    • 方法
      • sessionCreated(HttpSessionEvent event):会话创建时触发(如用户首次访问需会话的资源)。
      • sessionDestroyed(HttpSessionEvent event):会话销毁时触发(如超时、调用 invalidate())。
    • 典型场景:统计在线用户数、记录用户登录/下线时间、释放会话资源。
  2. HttpSessionAttributeListener

    • 用途:监听 HttpSession(会话级)属性的增删改事件。
    • 方法
      • attributeAdded:属性添加时触发。
      • attributeRemoved:属性删除时触发。
      • attributeReplaced:属性值被替换时触发。
    • 典型场景:监控用户状态变化(如购物车更新)、同步缓存数据。
  3. HttpSessionBindingListener

    • 用途:由 对象自身 实现,监听对象被绑定到会话或解除绑定的事件。
    • 方法
      • valueBound(HttpSessionBindingEvent event):对象被绑定到会话时触发。
      • valueUnbound(HttpSessionBindingEvent event):对象从会话中解除绑定时触发。
    • 典型场景:在对象绑定时初始化资源(如数据库连接),解除绑定时释放资源。
  4. HttpSessionActivationListener

    • 用途:在 分布式会话 场景下,监听会话钝化(序列化到磁盘)和激活(反序列化到内存)事件。
    • 方法
      • sessionDidActivate(HttpSessionEvent event):会话激活时触发。
      • sessionWillPassivate(HttpSessionEvent event):会话钝化前触发。
    • 典型场景:在会话迁移时清理非序列化字段(如线程局部变量)。

三、请求(ServletRequest)监听器

监听 单个 HTTP 请求的生命周期请求属性变化

  1. ServletRequestListener

    • 用途:监听单个请求的创建和销毁。
    • 方法
      • requestInitialized(ServletRequestEvent event):请求创建时触发。
      • requestDestroyed(ServletRequestEvent event):请求销毁时触发。
    • 典型场景:记录请求开始/结束时间、统计请求耗时。
  2. ServletRequestAttributeListener

    • 用途:监听 ServletRequest(请求级)属性的增删改事件。
    • 方法
      • attributeAdded:属性添加时触发。
      • attributeRemoved:属性删除时触发。
      • attributeReplaced:属性值被替换时触发。
    • 典型场景:监控请求参数变化、记录属性操作日志。

四、其他监听器

  1. ServletRequestListenerHttpSessionListener 的子类
    • 例如 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监听器主要包括以下几种:

  1. ServletContextListener

    • 功能描述:用于监听ServletContext对象的创建和销毁事件。当Web应用启动时,容器会自动创建一个ServletContext对象,并调用实现该接口类的contextInitialized方法;当Web应用停止时,容器会调用contextDestroyed方法。
    • 应用场景:在contextInitialized方法中可以进行一些初始化操作,如加载配置文件、初始化数据库连接池等;在contextDestroyed方法中可以进行清理工作,如释放资源、关闭数据库连接等。
  2. HttpSessionListener

    • 功能描述:用于监听HttpSession对象的创建和销毁事件。当一个HttpSession被创建时,容器会调用实现该接口类的sessionCreated方法;当一个HttpSession被销毁时,容器会调用sessionDestroyed方法。
    • 应用场景:在sessionCreated方法中可以记录用户的登录信息、初始化用户的会话数据等;在sessionDestroyed方法中可以进行清理工作,如移除用户在服务器上的缓存数据等。
  3. ServletRequestListener

    • 功能描述:用于监听ServletRequest对象的初始化和结束事件。当一个请求被创建时,容器会调用实现该接口类的requestInitialized方法;当一个请求结束时,容器会调用requestDestroyed方法。
    • 应用场景:可以在requestInitialized方法中进行请求的预处理,如检查用户的权限、记录请求的日志等;在requestDestroyed方法中可以进行请求的后处理,如释放资源、统计请求的处理时间等。
  4. HttpSessionAttributeListener

    • 功能描述:用于监听HttpSession对象中属性的增加、删除和替换事件。当一个属性被添加到HttpSession中时,容器会调用实现该接口类的attributeAdded方法;当一个属性从HttpSession中删除时,容器会调用attributeRemoved方法;当一个属性在HttpSession中被替换时,容器会调用attributeReplaced方法。
    • 应用场景:可以在attributeAdded方法中对新添加的属性进行处理,如验证属性的值、更新相关的业务数据等;在attributeRemoved方法中可以清理与属性相关的资源;在attributeReplaced方法中可以处理属性值的变化,如触发相关的业务逻辑。
  5. ServletRequestAttributeListener

    • 功能描述:用于监听ServletRequest对象中属性的增加、删除和替换事件。当一个属性被添加到ServletRequest中时,容器会调用实现该接口类的attributeAdded方法;当一个属性从ServletRequest中删除时,容器会调用attributeRemoved方法;当一个属性在ServletRequest中被替换时,容器会调用attributeReplaced方法。
    • 应用场景:与HttpSessionAttributeListener类似,可以在attributeAdded、attributeRemoved和attributeReplaced方法中对ServletRequest中的属性变化进行处理,以满足特定的业务需求。
  6. HttpSessionBindingListener

    • 功能描述:用于监听对象与HttpSession绑定和解除绑定的事件。当一个实现了该接口的对象被绑定到HttpSession中时,容器会调用valueBound方法;当该对象从HttpSession中解绑时,容器会调用valueUnbound方法。
    • 应用场景:可以在valueBound方法中执行对象与HttpSession绑定时的初始化操作,如将对象的状态设置为已绑定等;在valueUnbound方法中可以进行清理工作,如释放对象占用的资源等。
  7. HttpSessionActivationListener

    • 功能描述:用于监听HttpSession的活化和钝化事件。当一个HttpSession被激活时(即客户端恢复与服务器的交互),容器会调用实现该接口类的sessionWillActivate方法;当一个HttpSession被钝化时(即客户端长时间未与服务器交互),容器会调用sessionDidPassivate方法。
    • 应用场景:可以在sessionWillActivate方法中进行一些操作,如重新建立与后端系统的连接等;在sessionDidPassivate方法中可以将HttpSession中的数据持久化到存储设备中,以便在会话恢复时能够快速恢复数据。










🔟 参考 10

Java Servlet 监听器(Listener)用于监听 Web 应用中关键对象(如 ServletContextHttpSessionServletRequest)的生命周期和属性变化,共分为 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()

四、典型应用场景

  1. 初始化资源
    • ServletContextListener:应用启动时初始化数据库连接池或加载全局配置 。
  2. 统计在线用户
    • HttpSessionListener:通过 sessionCreated()sessionDestroyed() 统计活跃会话数 。
  3. 请求日志记录
    • ServletRequestListener:记录请求开始和结束时间,计算耗时 。
  4. 用户登录状态管理
    • HttpSessionBindingListener:用户登录时绑定对象到 Session,退出时释放资源 。
  5. 分布式会话同步
    • HttpSessionActivationListener:在集群环境中同步 Session 数据 。

五、配置方式

  • 注解:在监听器类上添加 @WebListener(推荐)。
  • XML:在 web.xml 中配置 <listener> 标签 。

总结

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



















本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/77328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全领域的AI战略准备:从概念到实践

网络安全领域的AI准备不仅涉及最新工具和技术的应用&#xff0c;更是一项战略必需。许多企业若因目标不明确、数据准备不足或与业务重点脱节而未能有效利用AI技术&#xff0c;可能面临严重后果&#xff0c;包括高级网络威胁数量的激增。 AI准备的核心要素 构建稳健的网络安全…

[数据结构]2. 顺序表

顺序表 1. 介绍基本概念存储方式优点缺点应用场景 2. 顺序表操作SeqList.hSeqlist.c 1. 介绍 基本概念 顺序表是用一组地址连续的存储单元依次存储线性表的数据元素。线性表是具有相同数据类型的 n 个数据元素的有限序列&#xff0c;在顺序表中&#xff0c;元素之间的逻辑顺序…

o3和o4-mini的升级有哪些亮点?

ChatGPT是基于OpenAI GPT系列的高性能对话生成AI&#xff0c;经过多代迭代不断提升自然语言理解和生成能力。 在过去的一年中&#xff0c;OpenAI先后发布了GPT-4、GPT‑4.1及多种mini版本&#xff0c;为不同使用场景提供灵活选择。​ 随着用户需求向更高效、更精准的推理和视觉…

Chrome漏洞可窃取数据并获得未经授权的访问权限

在发现两个关键漏洞后,谷歌发布了Chrome浏览器的紧急安全更新。这些漏洞可能允许攻击者窃取敏感数据并未经授权访问用户系统。 这些缺陷被识别为CVE-2025-3619和CVE-2025-3620,在Windows和Mac的135.0.7049.95/.96之前影响Chrome版本,影响Linux的135.0.7049.95/.96。该更新将在…

力扣面试150题--两数之和 和 快乐数

Day 25 题目描述 思路 创建一个hashmap从前向后遍历数组如果存在target-nums[i]在map中&#xff0c;记录它们两个的序号返回即可不存在&#xff0c;就将该元素放入map中&#xff0c;存放序号 注意&#xff1a;题目说的是必然存在唯一解 class Solution {public int[] twoSum…

Flutter_学习记录_状态管理之GetX

Flutter GetX 状态管理框架全面解析 1. 状态管理与 Flutter GetX 介绍 1.1 状态管理 通俗理解&#xff1a;当我们需要在多个页面&#xff08;组件/Widget&#xff09;之间共享状态&#xff08;数据&#xff09;&#xff0c;或者在一个页面中的多个子组件之间共享状态时&…

ASP.NET常见安全漏洞及修复方式

Microsoft IIS 版本信息泄露 查看网页返回的 Header 信息&#xff0c;默认会包含 IIS&#xff0c;ASP.NET 版本信息&#xff1a; 隐藏 Server 标头 编辑 web.config 文件&#xff0c;在 system.webServer 节点中配置 requestFiltering 来移除Server标头&#xff1a; <sec…

深入解析Java日志框架Logback:从原理到最佳实践

Logback作为Java领域最主流的日志框架之一,由Log4j创始人Ceki Glc设计开发,凭借其卓越的性能、灵活的配置以及与SLF4J的无缝集成,成为企业级应用开发的首选日志组件。本文将从架构设计、核心机制、配置优化等维度全面剖析Logback的技术细节。 一、Logback的架构设计与核心模…

OpenStack Yoga版安装笔记(22)Swift笔记20250418

一、官方文档 https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html#https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html# 二、对象存储简介&#xff08;Introduction to Object Storage&#xff09; OpenStack 对象存储&a…

Spring Boot日志系统详解:Logback与SLF4J的默认集成

大家好呀&#xff01;&#x1f44b; 今天我们来聊聊Spring Boot中一个超级重要但又经常被忽视的功能——日志系统&#xff01; 一、日志系统的重要性 首先&#xff0c;咱们得明白为什么日志这么重要&#xff1f;&#x1f937;‍♂️ 想象一下&#xff0c;你正在玩一个超级复…

【AI提示词】退休规划顾问专家

提示说明 随着人口老龄化的加剧&#xff0c;越来越多的人开始关注退休规划问题。一个专业的退休规划顾问可以帮助用户合理规划退休生活&#xff0c;确保退休后的生活质量。 提示词 # 角色 退休规划顾问专家## 注意 1. 专家设计应符合退休规划的专业性和可靠性&#xff0c;帮…

楼梯上下检测数据集VOC+YOLO格式5462张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5462 标注数量(xml文件个数)&#xff1a;5462 标注数量(txt文件个数)&#xff1a;5462 …

docker 部署服务工具记录

一、场景 项目需要使用dify和向量库milvus, 这两个工具都是使用docker 部署&#xff0c;因此需要安装docker. 二、docker安装 系统为debian , 刚开始安装不是超时&#xff0c;就是依赖版本冲突&#xff0c;查看系统镜像源文件&#xff1a; cat /etc/apt/sources.list 觉得可…

Oracle、MySQL、PostgreSQL三大数据库对比分析

Oracle、MySQL、PostgreSQL 三大数据库的对比分析&#xff0c;结合 Java SpringBoot 项目开发 的实际场景&#xff0c;重点说明分库分表、主从复制的实现难度及案例。 一、数据库核心对比 1. 核心区别与适用场景 维度OracleMySQLPostgreSQL定位企业级商业数据库轻量级开源数据…

Stable Diffusion LoRA模型加载实现风格自由

对于模型微调来说&#xff0c;直接进行微调需要的硬件配置和时间都是相当夸张的&#xff0c;但要想实现风格切换自由&#xff0c;也不是只有模型微调一个方式&#xff0c;LoRA技术可以说很完美的解决了这个难题。无论是二次元画风还是复古胶片质感&#xff0c;都只需要加载小巧…

贪心算法day10(无重叠区间)

1.无重叠区间 435. 无重叠区间 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 代码&#xff1a; class Solution {public static int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals,(v1,v2)->{return v1[0]-v2[0];});int left interva…

Python语言基础教程(上)4.0

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

PyTorch 浮点数精度全景:从 float16/bfloat16 到 float64 及混合精度实战

PyTorch 在深度学习中提供了多种 IEEE 754 二进制浮点格式的支持&#xff0c;包括半精度&#xff08;float16&#xff09;、Brain‑float&#xff08;bfloat16&#xff09;、单精度&#xff08;float32&#xff09;和双精度&#xff08;float64&#xff09;&#xff0c;并通过统…

在conda环境下使用pip安装库无法import

安装seleniumwire包&#xff0c;conda环境没有&#xff0c;pip之后安装不到当前conda环境 网上的方法都试过了&#xff0c;包括强制安装等 python -m pip install --upgrade --force-reinstall selenium-wire 最后定位应该是没有安装到当前conda的环境下&#xff0c;使用list…

【k8s系列4】工具介绍

1、虚拟机软件 vmware workstation 2、shell 软件 MobaXterm 3、centos7.9 下载地址 &#xff08;https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spma2c6h.25603864.0.0.374bf5adOaiFPW&#xff09; 4、上网软件