在Spring Boot中,可以通过自定义注解和拦截器来防止接口重复提交。以下是一个简单的示例:
- 自定义注解
NoRepeatSubmit
:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NoRepeatSubmit {
long timeout() default 5000; // 超时时间,单位毫秒
}
- 创建拦截器
NoRepeatSubmitInterceptor
:
@Component
public class NoRepeatSubmitInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
NoRepeatSubmit noRepeatSubmit = method.getAnnotation(NoRepeatSubmit.class);
if (noRepeatSubmit != null) {
String token = request.getHeader("token"); // 假设使用token作为唯一标识
if (token != null) {
boolean locked = false; // 假设已经有缓存系统,这里是检查是否已被锁定
if (locked) {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("重复提交");
out.flush();
return false;
}
}
}
}
return true;
}
}
- 注册拦截器
NoRepeatSubmitInterceptor
:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private NoRepeatSubmitInterceptor noRepeatSubmitInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(noRepeatSubmitInterceptor)
.addPathPatterns("/**"); // 拦截所有路径
}
}
- 使用注解:
@RestController
public class TestController {
@NoRepeatSubmit(timeout = 10000)
@GetMapping("/test")
public String test() {
// 你的业务逻辑
return "success";
}
}
在这个例子中,拦截器NoRepeatSubmitInterceptor
会在每次请求处理前检查是否有NoRepeatSubmit
注解。如果有,它会检查是否在指定的时间内已有请求使用了同样的token
。如果是,它将响应“重复提交”并中断请求处理。这里的缓存系统和锁定机制需要根据实际的缓存策略和数据库来实现。