Spring Boot 使用session监听器

Posted 刘勇的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot 使用session监听器相关的知识,希望对你有一定的参考价值。

session存在服务端,session监听器可以用来跟踪session的生命周期。spring-boot项目越来越流行,我就记录下spring boot项目中使用session监听器的过程,以便以后参考。

spring boot使用监听器非常方便,使用这2个注解就可自动加载注册了:@WebListener和@ServletComponentScan 

为了加深理解,使用在线百度翻译了下:当使用嵌入式容器时,可以通过使用@ServletComponentScan启用@WebServlet、@WebFilter和@WebListener注释的类的自动注册。

关键在于:在启动类上使用@ServletComponentScan,就可以自动扫描使用@WebServlet、@WebFilter和@WebListener注解的类完成自动注册。

1.编写session监听器类实现HttpSessionListener接口,并加上@WebListener注解,声明此类是一个监听器。

package com.listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * session监听器
 * @author Administrator
 */
@WebListener
public class SessionListener implements HttpSessionListener{

    private int onlineCount = 0;//记录session的数量
    
    /**
     * session创建后执行
     */
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        onlineCount++;
        System.out.println("【HttpSessionListener监听器】 sessionCreated, onlineCount:" + onlineCount);
        se.getSession().getServletContext().setAttribute("onlineCount", onlineCount);
    }

    /**
     * session失效后执行
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        if (onlineCount > 0) {
            onlineCount--;
        }
        System.out.println("【HttpSessionListener监听器】 sessionDestroyed, onlineCount:" + onlineCount);
        se.getSession().getServletContext().setAttribute("onlineCount", onlineCount);
    }

}

2.启动类上使用@ServletComponentScan,自动扫描带有(@WebServlet, @WebFilter, and @WebListener)注解的类,完成注册。

package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.boot.web.servlet.ServletComponentScan;


@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})//无数据库运行
@ServletComponentScan //scans from the package of the annotated class (@WebServlet, @WebFilter, and @WebListener) 
public class WebApp{
     public static void main(String[] args) {
         System.out.println(" springApplication run !");
         SpringApplication.run(WebApp.class,args);
    }
     
}

只用简单的2个注解就完成了session监听器的注册。这样就能监听到容器session的生命周期了。

注意:HttpServletRequest的getSession()方法,如果当前请求没有对应的session会自动创建session。

 

使用getSession(false)就不会创建session,如果没有当前请求对应的session就返回null.

 

以上是关于Spring Boot 使用session监听器的主要内容,如果未能解决你的问题,请参考以下文章

为 spring-session-jdbc 使用现有的 Spring Boot 数据源

spring boot:使用redis cluster集群作为分布式session(redis 6.0.5/spring boot 2.3.1)

在 Spring Boot 中使用 Spring Security 时不能使用任何类型的 SessionListener

spring boot 使用 redis session

spring boot监听器使用

spring boot 中使用redis session