SpringBoot接口防抖(防重复提交),接口幂等性,轻松搞定
warning:
这篇文章距离上次修改已过416天,其中的内容可能已经有所变动。
为了实现接口的防抖和幂等性,你可以使用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,表示这是一个重复提交
评论已关闭