# 监听器

# 什么是监听器

  • 监听器(Listener)是 J2EE Servlet 模块下的组件
  • Listener 的作用对 Web 应用对象的行为进行监控
  • 通过 Listener 监听自动触发指定的功能代码

# 三种监听对象

  • ServletContext 对全局 ServletContext 及其属性进行监听
  • HttpSession 对用户会话及其属性操作进行监听
  • ServletRequest 对请求及属性操作进行监听

# 过滤器与监听器的区别

  • 过滤器(Filter)的职责是对 URL 进行过滤拦截,是主动的执行
  • 监听器(Listener)的职责是对 Web 对象进行监听,是被动触发

# 开发监听器

  • 实现 XXXListener 接口,不同接口对应不同监听对象
  • 实现每个接口中独有的方法,实现触发监听的后续操作
  • 在 web.xml 中配置使监听器生效
// 使用注解则不使用配置,推荐使用配置(因为针对的是全局的监听)
@WebListener
public class FirstListener implements ServletContextListener{
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext已初始化");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext已销毁");
    }
}

# web.xml

<listener>
    <listener-class>com.imooc.listener.FirstListener</listener-class>
</listener>

# 内置对象监听器

# 内置对象监听接口

  • ServletContextListener 监听 ServletContext 对象创建、销毁等操作
  • HttpSessionListener 监听 HttpSession 对象创建、销毁等操作
  • ServletRequestListener 监听 HttpServletRequest 对象创建、销毁等操作
public class WebListener implements ServletContextListener, HttpSessionListener, ServletRequestListener {
  @Override
  public void contextInitialized(ServletContextEvent sce) {
    System.out.println("ServletContext已初始化");
  }

  @Override
  public void contextDestroyed(ServletContextEvent sce) {
    System.out.println("ServletContext已销毁");
  }

  @Override
  public void sessionCreated(HttpSessionEvent se) {
    HttpSession session = se.getSession();
    System.out.println("Session已被创建,SessionId:" + session.getId());
  }

  @Override
  public void sessionDestroyed(HttpSessionEvent se) {
    System.out.println("Session已被销毁");
  }

  @Override
  public void requestDestroyed(ServletRequestEvent sre) {
    System.out.println("HttpServletRequest已销毁");
  }

  @Override
  public void requestInitialized(ServletRequestEvent sre) {
    HttpServletRequest request = (HttpServletRequest)sre.getServletRequest();
    System.out.println("HttpServletRequest已创建,URI:" + request.getRequestURI());
  }

}

# 属性监听器

# 属性监听接口

  • ServletContextAttributeListener 监听全局属性操作(增删改)
  • HttpSessionAttributeListener 监听用户会话属性操作
  • ServletRequestAttributeListener 监听请求属性操作
public class WebAttributeListener implements ServletContextAttributeListener, HttpSessionAttributeListener, ServletRequestAttributeListener {
  @Override
  public void attributeAdded(ServletContextAttributeEvent event) {
    System.out.println("ServletContext新增属性:" + event.getName() + "->" + event.getValue());
  }

  @Override
  public void attributeRemoved(ServletContextAttributeEvent event) {

  }

  @Override
  public void attributeReplaced(ServletContextAttributeEvent event) {

  }

  @Override
  public void attributeAdded(HttpSessionBindingEvent event) {
    System.out.println("Session新增属性:" + event.getName() + "->" + event.getValue());

  }

  @Override
  public void attributeRemoved(HttpSessionBindingEvent event) {

  }

  @Override
  public void attributeReplaced(HttpSessionBindingEvent event) {

  }

  @Override
  public void attributeAdded(ServletRequestAttributeEvent srae) {
    System.out.println("Request新增属性:" + srae.getName() + "->" + srae.getValue());
  }

  @Override
  public void attributeRemoved(ServletRequestAttributeEvent srae) {

  }

  @Override
  public void attributeReplaced(ServletRequestAttributeEvent srae) {

  }

}

# 监听器的应用场景

  • 请求流量分析
上次更新: 2/13/2025, 3:29:47 AM