当前位置:   article > 正文

【springboot】接口防重复提交

【springboot】接口防重复提交

在Spring Boot应用中,防止接口重复提交(Debounce)和防止并发冲突的一种常见方法是使用拦截器(Interceptor)或者通过自定义注解配合AOP(面向切面编程)来实现。这里提供一种基于Spring Boot和Redis实现接口防抖和防重复提交的示例方案:

1. 创建防重复提交Token

客户端在发起请求时,可以生成一个唯一的请求标识(Token),并将此Token随请求一同发送到服务器。服务器接收到请求后,将Token存入Redis,并设置一个过期时间(如30秒),再次接收到相同Token的请求时,拒绝处理。

2. 创建自定义注解

首先创建一个自定义注解,如 @RepeatSubmit,标记在Controller层的方法上,表示需要防重复提交。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RepeatSubmit {
    int timeout() default 30; // 默认超时时间(单位:秒)
}
  • 1
  • 2
  • 3
  • 4
  • 5

3. 创建AOP切面

然后创建一个AOP切面类,用于处理带有@RepeatSubmit注解的方法。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class RepeatSubmitAspect {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Around("@annotation(repeatSubmit)")
    public Object doConcurrently(ProceedingJoinPoint joinPoint, RepeatSubmit repeatSubmit) throws Throwable {
        // 获取方法参数
        Object[] args = joinPoint.getArgs();

        // 从参数中取出或生成Token
        String token = extractTokenFromArgs(args); // 根据实际情况从参数中提取Token

        // 判断Token是否已存在于Redis中
        boolean exists = redisTemplate.opsForValue().exists(token);

        if (!exists) {
            // Token不存在,执行方法并将Token存入Redis
            redisTemplate.opsForValue().set(token, "", repeatSubmit.timeout(), TimeUnit.SECONDS);
            return joinPoint.proceed(args);
        } else {
            // Token已存在,抛出异常或返回错误信息
            throw new DuplicateRequestException("Duplicate request detected.");
        }
    }

    private String extractTokenFromArgs(Object[] args) {
        // 实际情况下,这里的逻辑需要根据实际参数结构来提取Token
        // 这里仅为示例,假设Token在第一个参数中
        return (String) args[0];
    }
}
  • 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

4. 使用自定义注解

在Controller层的方法上应用自定义注解:

@RestController
@RequestMapping("/api")
public class MyController {

    @PostMapping("/submit")
    @RepeatSubmit(timeout = 30)
    public ResponseObject submitAction(@RequestBody RequestObject request) {
        // 处理提交逻辑
        return response;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

通过这种方式,只要在短时间内同一个Token被重复提交,第二次及以后的请求将在AOP切面中被拦截并返回重复提交的错误提示,从而实现了接口防抖和防重复提交的目的。注意实际应用中可能需要根据项目的具体需求调整提取Token的方式以及存储和判断Token是否存在的方式。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/499790
推荐阅读
相关标签
  

闽ICP备14008679号