在本章中,介绍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