
springboot利用切面记录在线人数
依赖添加:在项目的POM文件中添加Spring Boot Starter Web和Session管理依赖。 监听器配置:在应用程序启动时,添加一个会话监听器,用于跟踪会话的创建和销毁。 统计逻辑:每当会话创建时,记录用户的唯一标识符(如用户ID),统计总数。 依赖添加:在POM文件中添加Spring Boot Starter AOP。 创建切面类:使用 注解配置:定义一个自定义注解,标注在需要统计的方法上。 拦截逻辑:在拦截方法中,获取用户ID并添加到Set集合中。
发布日期:2021-05-06 19:32:58
浏览次数:25
分类:精选文章
本文共 3072 字,大约阅读时间需要 10 分钟。
在开发论坛系统时,统计在线人数是一个重要的需求,可以通过Spring Boot的AOP(面向切面编程)实现。以下是两种常见的实现方法及其优缺点。
方法一:基于Session会话机制
优点:
- 即使没有用户信息也能正常统计。
- 可以设置会话超时,确保统计数据及时更新。
缺点:
- 如果用户在同一设备打开多个窗口或浏览器,会导致重复记录,统计结果偏高。
实现步骤:
示例代码:
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.Bean;import org.springframework.web.socket.WebSocketHandler;@SpringBootApplicationpublic class ForumApplication { public static void main(String[] args) { SpringApplication.run(ForumApplication.class, args); } @Bean public WebSocketHandler webSocketHandler() { return new WebSocketHandler() { @Override public void onConnected(WebSocketHandler.WebSocketConnection connection) { // 记录用户连接 onlineUsers.add(connection.getClientAddress()); } @Override public void onDisconnected(WebSocketHandler.WebSocketConnection connection) { // 记录用户断开 onlineUsers.remove(connection.getClientAddress()); } @Override public void onTextMessage(WebSocketHandler.TextMessageEvent event) { // 处理消息 } }; }}
方法二:基于接口拦截的Set集合
优点:
- 每次用户触发接口时记录一次,避免重复统计。
- 适合分布式系统中的跨域调用。
缺点:
- 需要确保每个请求都有唯一的用户标识符。
- 结合Session管理,避免重复记录同一用户。
实现步骤:
@Aspect
注解,拦截所有需要统计的接口。示例代码:
import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.springframework.stereotype.Component;import java.util.HashSet;import java.util.Set;@Component@Aspectpublic class UserOnlineAspect { private static final SetonlineUsers = new HashSet<>(); @Around("@annotation(UserOnline)") public Object interceptor(ProceedingJoinPoint point) { Object[] args = point.getArgs(); if (args != null && args.length > 0) { RequestParamInfo param = (RequestParamInfo) args[0]; String userId = param.getUserID(); if (!onlineUsers.contains(userId)) { onlineUsers.add(userId); } } try { return point.proceed(); } catch (Throwable e) { // 处理异常 return null; } } public static Integer getOnlineCount() { return onlineUsers.size(); }}@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface UserOnline {}
常见问题及解决方案
Caused by: java.lang.IllegalArgumentException: error at ::0 can’t find referenced pointcut
- 原因:AOP依赖冲突或点剪切配置错误。
- 解决方法:检查POM文件中的依赖版本,确保Spring Boot Starter AOP与其他相关依赖兼容,同时确认点剪切表达式正确。
点剪切表达式错误
- 原因:点剪切表达式不正确,导致拦截逻辑无法执行。
- 解决方法:使用正确的点剪切表达式,确保所有需要统计的接口都被拦截。
总结
在选择统计在线人数的方法时,需要根据具体需求进行权衡。基于Session会话机制简单易行,适合大多数情况;而基于Set集合的接口拦截则更灵活,适合复杂的分布式系统。两种方法都可以在Spring Boot中实现,但结合使用Session和AOP可以更好地保证统计的准确性和性能。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月16日 16时12分57秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Java基础学习总结(4)——对象转型
2025-04-02
Java基础学习总结(51)——JAVA分层理解
2025-04-02
Java基础学习总结(53)——HTTPS 理论详解与实践
2025-04-02
Java基础学习总结(54)——JSON和Map转换的工具类
2025-04-02
Java基础学习总结(56)——学Java必知十大学习目标
2025-04-02
Java基础学习总结(57)——Jrebel插件热部署
2025-04-02
Java基础学习总结(59)——30 个java编程技巧
2025-04-02
Java类实现一个类的障眼法
2025-04-02
Java基础学习总结(5)——多态
2025-04-02
Java基础学习总结(63)——Java集合总结
2025-04-02
Java基础学习总结(64)——Java内存管理
2025-04-02
Java基础学习总结(66)——配置管理库typesafe.config教程
2025-04-02
Java基础学习总结(67)——Java接口API中使用数组的缺陷
2025-04-02
Java基础学习总结(68)——有关Java线程方面的面试题
2025-04-02
Java基础学习总结(70)——开发Java项目常用的工具汇总
2025-04-02
Java基础学习总结(73)——Java最新面试题汇总
2025-04-02
Java基础学习总结(75)——Java反射机制及应用场景
2025-04-02
Java基础学习总结(76)——Java异常深入学习研究
2025-04-02
Java基础学习总结(80)——Java性能优化详解
2025-04-02