1. 概述

本教程将演示如何 **注册 jakarta.servlet.http.HttpSessionListener**,并使用 metrics库 跟踪 Web 应用中的活跃会话数量。

2. 定义监听器

可通过 web.xml 注册 HTTP 会话监听器:

<web-app ...>
    <listener>
        <listener-class>com.baeldung.web.SessionListenerWithMetrics</listener-class>
    </listener>
</web-app>

在 Servlet 3 环境中,也可使用 @WebListener 注册。此时需在主 SpringBootApplication 类上添加 @ServletComponentScan 注解。

此外,通过声明 ServletListenerRegistrationBean Bean 进行 Java 配置注册:

@Bean
public ServletListenerRegistrationBean<SessionListenerWithMetrics> sessionListenerWithMetrics() {
   ServletListenerRegistrationBean<SessionListenerWithMetrics> listenerRegBean =
     new ServletListenerRegistrationBean<>();
   
   listenerRegBean.setListener(new SessionListenerWithMetrics());
   return listenerRegBean;
}

3. 基础监听器实现

简单监听器将 实时跟踪活跃会话数量

public class SessionListenerWithMetrics implements HttpSessionListener {

    private final AtomicInteger activeSessions;

    public SessionListenerWithMetrics() {
        super();

        activeSessions = new AtomicInteger();
    }

    public int getTotalActiveSession() {
        return activeSessions.get();
    }

    public void sessionCreated(final HttpSessionEvent event) {
        activeSessions.incrementAndGet();
    }
    public void sessionDestroyed(final HttpSessionEvent event) {
        activeSessions.decrementAndGet();
    }
}

会话创建时触发 sessionCreated

HttpSession session = request.getSession();

会话销毁时触发 sessionDestroyed

session.invalidate();

⚠️ 此机制虽可获取当前会话计数,但需额外逻辑实现 实时监控与透明度。此时 metrics 库的价值就体现出来了——它提供多种现成报告器,轻松发布指标。

4. 集成 Metrics 的监听器

与其自研监控方案,不如直接使用 metrics 库。首先添加依赖:

<dependency>
    <groupId>com.codahale.metrics</groupId>
    <artifactId>metrics-core</artifactId>
    <version>4.2.21</version>
</dependency>

引入 metrics 后,使用 Counter 重写监听器:

public class SessionListenerWithMetrics implements HttpSessionListener {

    private final Counter counterOfActiveSessions;

    public SessionListenerWithMetrics() {
        super();
        counterOfActiveSessions = MetricRegistrySingleton.metrics.counter("web.sessions.active.count");
    }

    public void sessionCreated(final HttpSessionEvent event) {
        counterOfActiveSessions.inc();
    }
    public void sessionDestroyed(final HttpSessionEvent event) {
        counterOfActiveSessions.dec();
    }
}

MetricRegistry(所有应用指标的核心注册表)通过全局静态字段引用:

public final class MetricRegistrySingleton {
    public static final MetricRegistry metrics = new MetricRegistry();
}

发布指标到应用日志系统非常简单:

Logger logger = LoggerFactory.getLogger("com.baeldung.monitoring");
Slf4jReporter reporter = Slf4jReporter.forRegistry(metrics).outputTo(logger).
  convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build();
reporter.start(5, TimeUnit.MINUTES);

5. 总结

✅ 本教程展示了在 Web 应用部署描述符中注册 HttpSessionListener 的两种监控方案:

  1. 手动计数器实现
  2. 基于 metrics 库的成熟方案

完整实现参考 GitHub 示例项目


原始标题:HttpSessionListener Example