防止重复提交

自定义重复提交标记

  1. 自定义重复提交注解(NoRepeatSubmit)
  2. 对于防止重复提交的Controllor里的方法加上注解
  3. 新增Aspect切入点,为NoRepeatSubmit加入切入点
  4. 每次提交表单时,aspect都会保存当前的Key到Redis
  5. 重新提交时aspect会判断当前的redis是否有该key,若有则拦截
BaseRepeatSubmitAop.java
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
34
35
36
37
38
39
40
41
42
@Slf4j
@Aspect
@Component
public class BaseRepeatSubmitAop {
    @Autowired
    private RedisCacheUtil redisCacheUtil;
    @Autowired
    private LoginUserApi loginUserApi;
 
    final static String REPEAT_KEY = "CACHE:REPEAT:";
 
    @Around("@annotation(noRepeatSubmit)")
    public Object around(ProceedingJoinPoint point, NoRepeatSubmit noRepeatSubmit) throws Throwable {
        //获取注解
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
 
        String className = method.getDeclaringClass().getName();
        String methodName = method.getName();
 
        //组装key  用户唯一标识+操作类+方法
        String currentTenantId = loginUserApi.getCurrentTenantId();
        String key = REPEAT_KEY + currentTenantId + "_" + className + "_" + methodName;
        int keyHashCode = Math.abs(key.hashCode());
        log.info("key:{},keyHashCode:{}", key, keyHashCode);
 
        int timeOut = noRepeatSubmit.timeout();
        log.info("超时时间:{}", timeOut);
 
        Object value = redisCacheUtil.get(key);
 
        if (value != null) {
            throw new BusinessException("提交间隔不得超过"+timeOut+"秒!");
        }
 
        redisCacheUtil.set(key, keyHashCode, timeOut);
 
        Object object = point.proceed();
 
        return object;
    }
}

  

复制代码
@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface NoRepeatSubmit {

    /**
     * 指定时间内不能重复提交(单位:秒)
     *
     * @return
     */
    int timeout() default 1;
}
复制代码

 

posted @   蔡徐坤1987  阅读(109)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示