SpringBoot基于WebListener实现实时在线人数统计
一、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
二、application.properties文件设置
# 设置1分钟的有效时间
server.servlet.session.timeout=1m
三、计数服务
import org.springframework.stereotype.Service;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author qinxun
* @date 2023-06-05
* @Descripion: 计数服务
*/
@Service
public class CountService {
static AtomicInteger atomicInteger = new AtomicInteger(0);
/**
* 新增在线人数
*/
public void incr(int cnt) {
atomicInteger.addAndGet(cnt);
}
/**
* 获取当前在线的人数
*/
public int getOnlineCnt() {
return atomicInteger.get();
}
}
四、session监听器
import com.example.quartzdemo.service.CountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* @author qinxun
* @date 2023-06-05
* @Descripion: session监听器
*/
@Component
@WebListener
public class LoginUserCountListener implements HttpSessionListener {
@Autowired
private CountService countService;
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("新增一个用户");
HttpSessionListener.super.sessionCreated(se);
countService.incr(1);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁一个用户");
HttpSessionListener.super.sessionDestroyed(se);
countService.incr(-1);
}
}
五、创建访问层
import com.example.quartzdemo.service.CountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* @author qinxun
* @date 2023-06-05
* @Descripion: 测试
*/
@RestController
public class WebController {
@Autowired
private CountService countService;
/**
* 登录
*/
@RequestMapping("/login")
public String login(String username, HttpServletRequest servletRequest) {
HttpSession session = servletRequest.getSession();
session.setAttribute("username", username);
return "欢迎您:" + username + ",当前在线人数:" + countService.getOnlineCnt();
}
/**
* 退出登陆
*/
@RequestMapping("/logout")
public String logount(HttpSession httpSession) {
// 注销当前的session
httpSession.invalidate();
return "登出成功, 当前在线人数: " + countService.getOnlineCnt();
}
}
六、测试
sole.mjc: 手写本地缓存,第一次调用的时候放不进去值
mfylove: 大于系统时间改成小于系统时间就好了,小问题
梧桐_月: 你的解决了嘛,我也是这个问题
qq_53122140: 配置完启动的时候出现这个错误 Unable to start embedded Tomcat server
weixin_48329222: 有源码嘛?公开一下