springboot重复提交问题
前言
当用户提交订单的时候,有时候网络不好,或者手速快,连点好多下,这下麻烦了,数据库出现了多条一样的数据,坏菜,查询的时候或者其他业务逻辑的时候,报错了,真是,前端怎么没做校验呢?又来一句,后端怎么不做校验呢?扯皮,简单方法,在特殊接口(增加方法)上面加注解就解决了。
用guardian的一个小组件就解决了
一、guardian是什么?
guardian是防重提交、接口限流、接口幂等、参数自动Trim、慢接口检测、请求链路追踪、IP黑白名单、防重放攻击、接口开关 —— 一个 Starter 搞定 API 请求防护。
地址:GitHub - BigGG-Guardian/guardian: 防重提交、接口限流、接口幂等、参数自动Trim、慢接口检测、请求链路追踪、IP黑白名单、防重放攻击、接口开关 —— 一个 Starter 搞定 API 请求防护。 · GitHub
二、使用步骤
1.引入库
<dependency> <groupId>io.github.biggg-guardian</groupId> <artifactId>guardian-repeat-submit-spring-boot-starter</artifactId> <version>1.10.0</version> </dependency>2.配置yaml
如果你装了redis,就可以选择redis,没装redis,就用local就行。
3.加注解
@PostMapping("/submit") @RepeatSubmit(interval = 10, timeUnit = TimeUnit.SECONDS, message = "订单正在处理,请勿重复提交") public Result submitOrder(@RequestBody OrderDTO order) { return orderService.submit(order); }@RepeatSubmit注解里面什么意思呢?
10 秒内同一个用户、同一个接口、同样的请求参数,第二次请求会被直接拦截,直接报message里面的消息。
这样,3步就好了。
写到这里,正常情况下就已经配置完了,下面还会有一些配置了不能生效的场景,我列举一下
配置不生效场景
场景
因为这个功能是通过拦截器实现的,所以如果你的项目中有使用拦截器,查看一下拦截器的配置信息,如果是public class InterceptorConfig extends WebMvcConfigurationSupport,那么你的配置就会失效,改为public class InterceptorConfig implements WebMvcConfigurer就可以了。
总结
这个本人在项目实战中用的场景,做了一些总结,然后分享给大家,希望能帮到你,谢谢
