前言

在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例如:用户鼠标点击过快而重复保存,从而创建了2笔一模一样的单据。针对类似情况,我们就可以全局地控制接口不允许重复提交。

实现思路

  • 创建拦截器 Interceptor,拦截所有API请求
  • 将用户唯一标识(token或者jsessionid)+接口地址进行拼接,作为后续步骤的 redis-key
  • 判断Redis是否存在该key值,存在说明重复提交,不存在就存入Redis,过期时间1秒

代码示例

创建拦截器 RepeatSubmitInterceptor

@Component
public class RepeatSubmitInterceptor extends HandlerInterceptorAdapter {@Autowiredprivate StringRedisTemplate stringRedisTemplate;//防重时间间隔(秒)private final int duration = 1;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (request.getDispatcherType() == DispatcherType.ERROR){return true;}String token = request.getHeader("token");String lockKey = "RepeatSubmit:" + token + ":" + request.getServletPath();Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey, "", duration, TimeUnit.SECONDS);if (!result){throw new Exception("请勿重复提交");}return true;}
}

注入拦截器

@Configuration
public class MvcConfig implements WebMvcConfigurer {@Autowiredprivate RepeatSubmitInterceptor repeatSubmitInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(repeatSubmitInterceptor);}
}

测试

建个 controller 并创建个简单的测试接口,打开 postman 快速点击2次请求,结果如下:

总结

这边只是提供一种简单的方案,还可以有其他扩展,例如:

  • 增加参数的校验,只做相同参数的重复判定,参数不同可以重复提交
  • 增加AOP自定义注解,只有注解标识的接口才会重复判定
  • 使用Session替代Redis进行存储和校验(不适用于tomcat集群)

SpringBoot+Redis防止接口重复提交相关推荐

  1. SpringBoot 自定义注解+AOP+Redis 防止接口重复提交表单数据

    SpringBoot结合Redis处理重复提交 数据重复提交导致多次请求服务.入库,产生脏数据.冗余数据等情况.禁止重复提交使我们保证数据准确性及安全性的必要操作. 实际上,造成这种情况的场景不少: ...

  2. SpringBoot + Redis 解决海量重复提交问题

    作者 | 慕容千语 来源 | https://www.jianshu.com/p/c806003a8530 前言 在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,我们来解释一下幂等的概念: ...

  3. 【SpringBoot应用篇】SpringBoot+Redis实现接口幂等性校验

    [SpringBoot应用篇]SpringBoot+Redis实现接口幂等性校验 幂等性 解决方法 Pom token令牌 yml @ApiIdempotentAnn ApiIdempotentInt ...

  4. 接口重复提交解决方案

    接口重复提交解决方案 参考文章: (1)接口重复提交解决方案 (2)https://www.cnblogs.com/java-le/p/11056635.html (3)https://www.cod ...

  5. 使用redis实现防止重复提交,成功解决方案 春风化作秋雨 2018-09-13 18:09:52 13787 收藏 6 分类专栏: 解决方案 版权 1、业务场景 业务开发中,常常涉及对前端操作

    使用redis实现防止重复提交,成功解决方案 1.业务场景 业务开发中,常常涉及对前端操作进行重复校验,避免重复提交造成数据重复操作.比如转账操作,因为网络卡顿,客户连续点击转账按钮,造成多次转成:又 ...

  6. 利用Redis实现防止接口重复提交功能

    在划水摸鱼之际,突然听到有的用户反映增加了多条一样的数据,这用户立马就不干了,让我们要马上修复,不然就要投诉我们. 这下鱼也摸不了了,只能去看看发生了什么事情.据用户反映,当时网络有点卡,所以多点了几 ...

  7. php接口防止app重复提交,AOP防止接口重复提交

    实现原理 通过自定义注解标记哪些接口需要防范重复提交问题,并定义保持时间: 在Aspect中定义切点,织入所有被自定义注解标记的方法: 在Aspect中定义通知方法,通过PointCut获取类全名.被 ...

  8. redis+aop防重复提交

    文章目录 1.防重复提交注解 2.redis分布式锁 3.防止重复提交Aop 之前有记录一篇用redis+拦截器防重复提交的内容: redis+拦截器防重复提交 1.防重复提交注解 @Target(E ...

  9. springboot防止表单重复提交

    springboot和vue使用时网络卡导致请求并发提交 数据请求做了去重处理,但是无法处理重复并发请求 实现代码 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown ...

最新文章

  1. 同等学力计算机综合难吗,报考2018年同等学力申硕计算机在职研究生毕业很困难吗...
  2. C语言改造二分法(Modified Binary Search)算法(附完整源码)
  3. QT的QStylePlugin类的使用
  4. Comet---“服务器推”技术实现
  5. Linux Shell脚本入门教程系列之(八)Shell printf命令详解
  6. 【算法】剑指 Offer 48. 最长不含重复字符的子字符串
  7. 平板直撑的腰椎问题(塌腰)
  8. ARP欺骗***技术及防护
  9. Dns信息收集工具集合
  10. 路科验证示例_角度形式验证示例
  11. 教育部 计算机类专业代码,全国本科专业代码查询
  12. ros清华源_ROS操作系统学习(一)ROS安装
  13. 如何用计算机求一个正数的算术平方根,用计算器求一个正数的算术平方根
  14. python把英语句子成分字母_如何标注英语句子成分?
  15. 容器服务ACK+容器网络文件系统CNFS快速搭建NGINX网站(体验有礼)
  16. java货郎担问题求解_货郎担问题的四种实现方法
  17. Android反模拟器的总结
  18. 自学编程到底需要多长时间?
  19. Docker Swarm简单教程
  20. 随风杂谈(长期更新)

热门文章

  1. 用dwz+springmvc出现这个问题Http status: 200 OK ajaxOptions: parsererror thrownError
  2. 生产订单总目标成本为0
  3. 项目经理的十二条规则
  4. SAP中如何给成本要素分配多个默认成本中心
  5. NBA史上薪水最高球员排行榜
  6. 保鲜、保生,生鲜电商的两码事
  7. 戴尔背书飞贷:创新IT技术直击金融机构互联网转型需求
  8. 大工17春计算机文化基础在线测试3,大工17春《计算机文化基础》在线测试3答案...
  9. python输出一个数的每一位_Python练习实例88 | 读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。...
  10. ajax 同步异步true,async: false 实现AJAX同步请求 ( $.ajax同步/异步(async:false/true) )(示例代码)...