在本章中,介绍SpringBoot的会话监听器 HttpSessionListner 用法,其实就是Servlet的会话监听器。

HttpSessionListener 可以在会话创建和销毁时提供钩子方法,我们只需要实现 sessionCreated()sessionDestroyed() 方法即可。

  • sessionCreated() 方法在创建新会话时调用,
  • sessionDestroyed() 在会话超时或会话使用 #invalidate() 方法无效时触发

要在 SpringBoot 中使用会监听器,我们需要创建一个实现 HttpSessionListener 的类。下面介绍具体的操作步骤

1. HttpSessionListener接口实现

这里,我们使用会话监听器实现一个访问者的计数器的简单功能。

package com.example.yxjc.listner;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.concurrent.atomic.AtomicInteger;

@WebListener
public class UserSessionListener implements HttpSessionListener {

    private final AtomicInteger counter = new AtomicInteger();

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("session id: " + se.getSession().getId());
        System.out.println("创建session,开始计数");
        counter.incrementAndGet();  //计数加1
        updateSessionCounter(se);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("session id: " + se.getSession().getId());
        System.out.println("session销毁,移除计数");
        counter.decrementAndGet();  //移除
        updateSessionCounter(se);
    }

    private void updateSessionCounter(HttpSessionEvent httpSessionEvent){
        //更新计数器
        httpSessionEvent.getSession().getServletContext()
                .setAttribute("activeSession", counter.get());
        System.out.println("计数器,"+counter.get());

    }

} 

在上面的代码中。 我们使用 AtomicInteger作为会话计数器。会话创建时增加计数,销毁时减少计数。 在我们的示例中,我们使用了@WebListener 注解。

2. 创建Rest控制器

让我们创建一个简单的 Rest 控制器来测试我们的应用程序。


 package com.example.yxjc.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@RestController
public class SessionController {

    @GetMapping("/session/count")
    public String count(HttpServletRequest request, HttpServletResponse response){

        HttpSession session = request.getSession(false);
        if(session == null){
            System.out.println("创建sesion会话");
            session = request.getSession(true);
        }
        return "Session 测试返回";
    }
} 

3. SpringBoot 主函数

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan
public class YxjcBootApplication {

	public static void main(String[] args) {
		SpringApplication.run(YxjcBootApplication.class, args);
	}

}

我们使用@ServletComponentScan注释来启用@WebListener 扫描。
访问地址http://127.0.0.1:8081/session/count,看到返回结果。
创建sesion会话
session id: B5814543FA0C8DA3DC9D950452826C9E
创建session,开始计数
计数器,1
然后使用新的浏览器继续访问地址http://127.0.0.1:8081/session/count,看到返回结果。
创建sesion会话
session id: 8551218AB43A5517032CAE40F09CC379
创建session,开始计数
计数器,2