更新时间: 2023-06-11 00:57:13#如何保证API接口防重,幂等 看了几篇,就是redis 简单实用, 拿token + route api + md5(请求参数)(如果有验签,直接用它替代). 记得设置个过期时间 总结一 总结二 ps: 项目验签,目前用openresty lua处理的。 逻辑多了后,就看出gateway 的重要性了 。 方法可以在HandlerInterceptor 的preHandle中处理 @Inherited @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RepeatSubmit { /** * 间隔时间(ms),小于此时间视为重复提交 */ public int interval() default 5000; /** * 提示消息 */ public String message() default "不允许重复提交,请稍候再试"; } 关键代码 if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class); if (annotation != null) { if (this.isRepeatSubmit(request, annotation)) { Map<String, Object> map = new HashMap<>(); map.put("status", 500); map.put("msg", annotation.message()); response.setContentType("application/json;charset=utf-8"); response.getWriter().write(new ObjectMapper().writeValueAsString(map)); return false; } } return true; } else { return true; } 完整示例: @RestController public class HelloController { @PostMapping("/hello") @RepeatSubmit(interval = 100000) public String hello(@RequestBody String msg) { System.out.println("msg = " + msg); return "hello"; } }