Spring Cloud项目如何防止重复提交(自定义注解)
在Spring Cloud项目中,防止重复提交可以通过自定义注解和拦截器实现。以下是一个简单的示例:
- 自定义注解
@NoRepeatSubmit
:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NoRepeatSubmit {
long timeout() default 5000; // 超时时间,单位毫秒,默认5秒内禁止重复提交
}
- 创建一个拦截器
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");
if (token == null) {
token = request.getParameter("token");
}
if (token == null) {
throw new RuntimeException("无法获取请求标识,无法检查重复提交");
}
// 根据token检查是否重复提交
boolean isRepeat = checkIfRepeat(token, noRepeatSubmit.timeout());
if (isRepeat) {
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write("{\"code\":\"400\",\"message\":\"请勿重复提交\"}");
return false;
}
// 没有重复提交,保存token
saveToken(token, noRepeatSubmit.timeout());
}
}
return true;
}
// 模拟检查是否重复提交的方法
private boolean checkIfRepeat(String token, long timeout) {
// 实现逻辑,根据token和超时时间判断是否重复提交
return false; // 假设没有重复提交
}
// 模拟保存token的方法
private void saveToken(String token, long timeout) {
// 实现逻辑,保存token至缓存,并设置超时时间
}
}
- 注册拦截器,在配置类中添加拦截器注册:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private NoRepeatSubmitInterceptor noRepeatSubmitInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(noRepeatSubmitInterceptor)
.addPathPatterns("/**"); // 拦截所有路径
}
}
- 使用自定义注解:
@RestController
public class YourContro
评论已关闭