springboot利用切面记录在线人数
发布日期:2021-05-06 19:32:58 浏览次数:25 分类:精选文章

本文共 3072 字,大约阅读时间需要 10 分钟。

在开发论坛系统时,统计在线人数是一个重要的需求,可以通过Spring Boot的AOP(面向切面编程)实现。以下是两种常见的实现方法及其优缺点。

方法一:基于Session会话机制

优点:

  • 即使没有用户信息也能正常统计。
  • 可以设置会话超时,确保统计数据及时更新。

缺点:

  • 如果用户在同一设备打开多个窗口或浏览器,会导致重复记录,统计结果偏高。

实现步骤:

  • 依赖添加:在项目的POM文件中添加Spring Boot Starter Web和Session管理依赖。
  • 监听器配置:在应用程序启动时,添加一个会话监听器,用于跟踪会话的创建和销毁。
  • 统计逻辑:每当会话创建时,记录用户的唯一标识符(如用户ID),统计总数。
  • 示例代码:

    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管理,避免重复记录同一用户。

    实现步骤:

  • 依赖添加:在POM文件中添加Spring Boot Starter AOP。
  • 创建切面类:使用@Aspect注解,拦截所有需要统计的接口。
  • 注解配置:定义一个自定义注解,标注在需要统计的方法上。
  • 拦截逻辑:在拦截方法中,获取用户ID并添加到Set集合中。
  • 示例代码:

    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 Set
    onlineUsers = 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可以更好地保证统计的准确性和性能。

    上一篇:阿里云内容管理图片校验简单使用
    下一篇:基于DFA算法实现文章敏感词过滤

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2025年04月16日 16时12分57秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章