赞
踩
在Spring Boot应用中,防止接口重复提交(Debounce)和防止并发冲突的一种常见方法是使用拦截器(Interceptor)或者通过自定义注解配合AOP(面向切面编程)来实现。这里提供一种基于Spring Boot和Redis实现接口防抖和防重复提交的示例方案:
客户端在发起请求时,可以生成一个唯一的请求标识(Token),并将此Token随请求一同发送到服务器。服务器接收到请求后,将Token存入Redis,并设置一个过期时间(如30秒),再次接收到相同Token的请求时,拒绝处理。
首先创建一个自定义注解,如 @RepeatSubmit
,标记在Controller层的方法上,表示需要防重复提交。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RepeatSubmit {
int timeout() default 30; // 默认超时时间(单位:秒)
}
然后创建一个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]; } }
在Controller层的方法上应用自定义注解:
@RestController
@RequestMapping("/api")
public class MyController {
@PostMapping("/submit")
@RepeatSubmit(timeout = 30)
public ResponseObject submitAction(@RequestBody RequestObject request) {
// 处理提交逻辑
return response;
}
}
通过这种方式,只要在短时间内同一个Token被重复提交,第二次及以后的请求将在AOP切面中被拦截并返回重复提交的错误提示,从而实现了接口防抖和防重复提交的目的。注意实际应用中可能需要根据项目的具体需求调整提取Token的方式以及存储和判断Token是否存在的方式。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。