SpringBoot接口防抖(防重复提交),接口幂等性,轻松搞定
为了实现接口的防抖和幂等性,你可以使用Spring Boot中的注解和拦截器。以下是一个简单的例子:
- 创建自定义注解
Idempotent
:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Idempotent {
String key() default "";
long time() default 10000;
}
- 创建拦截器
IdempotentInterceptor
:
@Component
public class IdempotentInterceptor implements HandlerInterceptor {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
Idempotent methodAnnotation = method.getAnnotation(Idempotent.class);
if (methodAnnotation != null) {
String key = methodAnnotation.key();
long time = methodAnnotation.time();
if (key == null || key.isEmpty()) {
key = request.getRequestURI();
}
String token = UUID.randomUUID().toString();
stringRedisTemplate.opsForValue().set(key, token, Duration.ofMillis(time));
response.setHeader("token", token);
// 检查重复提交
String previousToken = stringRedisTemplate.opsForValue().get(key);
if (previousToken != null && token.equals(previousToken)) {
return false; // 重复提交
}
}
}
return true;
}
}
- 注册拦截器
IdempotentInterceptor
:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private IdempotentInterceptor idempotentInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(idempotentInterceptor)
.addPathPatterns("/**"); // 拦截所有请求
}
}
- 使用
Idempotent
注解:
@RestController
public class TestController {
@GetMapping("/test")
@Idempotent(key = "test", time = 30000)
public String test() {
// 你的逻辑
return "success";
}
}
在这个例子中,当你在TestController
的test
方法上使用@Idempotent
注解时,系统会根据提供的key
和time
生成一个唯一的token,并将其设置到Redis中。如果同一个key
在指定的时间内再次请求,则会返回false,表示这是一个重复提交
评论已关闭