• 后端使用aop和redis实现防抖


    在公司的代码开发中遇到了,快速点击就会重复提交的bug,刚好最近在优化代码于是想着在后端实现防抖

    1.整体思路

    在这里插入图片描述

    2.创建防抖的注解

    防抖我一般放在存储方法上,在程序运行时使用,于是我的防抖注解是method类型

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface AntiShake {
    
        /**
         * 默认的防抖时间ms
         * @return
         */
        long value() default 1000;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3. 接口防抖aop

    @annotation(com.hy.district.annotation.AntiShake)
    就是定位到我加了AntiShake的方法上,只有这些方法才走aop防抖
    redisUtil是redis的工具类主要是对存储与获取进行封装,百度一下很多

    /**
     * 接口防抖aop
     */
    @Aspect
    @Component
    @Slf4j
    public class AntiShakeAOP {
    
        @Autowired
        private RedisUtil redisUtil;
    
        @Around(value = "@annotation(com.hy.district.annotation.AntiShake)")
        public Object antiShake(ProceedingJoinPoint pjp) throws Throwable {
            // 获取调用方法的信息和签名信息
            MethodSignature signature = (MethodSignature) pjp.getSignature();
            // 获取方法
            Method method = signature.getMethod();
            // 获取注解中的参数
            AntiShake aAnnotation = method.getAnnotation(AntiShake.class);
            // 查询redis中是否存在对应关系
            String key = method.getName() + RedisUtil.prefix + SecurityUtils.getUserId();
            Boolean aBoolean = redisUtil.hasKey(key);
            log.error("redis是否有建===> {}", aBoolean);
            if (!aBoolean) {
                redisUtil.setCacheObject(key, aAnnotation.value(), aAnnotation.value(), TimeUnit.MILLISECONDS);
                return pjp.proceed();
            } else {
                log.error("请勿重复点击");
                return null;
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    4. 使用

    直接在要用的接口上加上就行了,可以自定义设置防抖时间,不设置就会使用你注解里面的默认时间

    
    @PostMapping("/addAssessmentObject")
        @ApiOperation(value = "存储", notes = "存储")
        @AntiShake(1000)
        public R<String> addAssessmentObject(@RequestBody @Validated TAssessmentObjectDTO tAssessmentObjectDTO) {
            return tAssessmentObjectService.addAssessmentObject(tAssessmentObjectDTO);
        }
      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    RBAC介绍
    走进Redis:哨兵集群
    从Apollo配置中心看分布式架构设计
    用户自定义函数_大数据培训
    什么是存储服务器?
    Java项目:SSM个人博客管理系统
    VS Code 这么牛,再次印证了一句名言
    react笔记_06react中进行事件绑定
    在 MATLAB 中,如何高效地处理大规模矩阵运算以提高程序的运行速度?
    纯前端实现用户在线制作操作引导(图片区域画框并且可引导)intro.js
  • 原文地址:https://blog.csdn.net/biancheng4/article/details/133772186