SpringBoot+Redis防止接口重复提交
前言
在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例如:用户鼠标点击过快而重复保存,从而创建了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防止接口重复提交相关推荐
- SpringBoot 自定义注解+AOP+Redis 防止接口重复提交表单数据
SpringBoot结合Redis处理重复提交 数据重复提交导致多次请求服务.入库,产生脏数据.冗余数据等情况.禁止重复提交使我们保证数据准确性及安全性的必要操作. 实际上,造成这种情况的场景不少: ...
- SpringBoot + Redis 解决海量重复提交问题
作者 | 慕容千语 来源 | https://www.jianshu.com/p/c806003a8530 前言 在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,我们来解释一下幂等的概念: ...
- 【SpringBoot应用篇】SpringBoot+Redis实现接口幂等性校验
[SpringBoot应用篇]SpringBoot+Redis实现接口幂等性校验 幂等性 解决方法 Pom token令牌 yml @ApiIdempotentAnn ApiIdempotentInt ...
- 接口重复提交解决方案
接口重复提交解决方案 参考文章: (1)接口重复提交解决方案 (2)https://www.cnblogs.com/java-le/p/11056635.html (3)https://www.cod ...
- 使用redis实现防止重复提交,成功解决方案 春风化作秋雨 2018-09-13 18:09:52 13787 收藏 6 分类专栏: 解决方案 版权 1、业务场景 业务开发中,常常涉及对前端操作
使用redis实现防止重复提交,成功解决方案 1.业务场景 业务开发中,常常涉及对前端操作进行重复校验,避免重复提交造成数据重复操作.比如转账操作,因为网络卡顿,客户连续点击转账按钮,造成多次转成:又 ...
- 利用Redis实现防止接口重复提交功能
在划水摸鱼之际,突然听到有的用户反映增加了多条一样的数据,这用户立马就不干了,让我们要马上修复,不然就要投诉我们. 这下鱼也摸不了了,只能去看看发生了什么事情.据用户反映,当时网络有点卡,所以多点了几 ...
- php接口防止app重复提交,AOP防止接口重复提交
实现原理 通过自定义注解标记哪些接口需要防范重复提交问题,并定义保持时间: 在Aspect中定义切点,织入所有被自定义注解标记的方法: 在Aspect中定义通知方法,通过PointCut获取类全名.被 ...
- redis+aop防重复提交
文章目录 1.防重复提交注解 2.redis分布式锁 3.防止重复提交Aop 之前有记录一篇用redis+拦截器防重复提交的内容: redis+拦截器防重复提交 1.防重复提交注解 @Target(E ...
- springboot防止表单重复提交
springboot和vue使用时网络卡导致请求并发提交 数据请求做了去重处理,但是无法处理重复并发请求 实现代码 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown ...
最新文章
- 同等学力计算机综合难吗,报考2018年同等学力申硕计算机在职研究生毕业很困难吗...
- C语言改造二分法(Modified Binary Search)算法(附完整源码)
- QT的QStylePlugin类的使用
- Comet---“服务器推”技术实现
- Linux Shell脚本入门教程系列之(八)Shell printf命令详解
- 【算法】剑指 Offer 48. 最长不含重复字符的子字符串
- 平板直撑的腰椎问题(塌腰)
- ARP欺骗***技术及防护
- Dns信息收集工具集合
- 路科验证示例_角度形式验证示例
- 教育部 计算机类专业代码,全国本科专业代码查询
- ros清华源_ROS操作系统学习(一)ROS安装
- 如何用计算机求一个正数的算术平方根,用计算器求一个正数的算术平方根
- python把英语句子成分字母_如何标注英语句子成分?
- 容器服务ACK+容器网络文件系统CNFS快速搭建NGINX网站(体验有礼)
- java货郎担问题求解_货郎担问题的四种实现方法
- Android反模拟器的总结
- 自学编程到底需要多长时间?
- Docker Swarm简单教程
- 随风杂谈(长期更新)
热门文章
- 用dwz+springmvc出现这个问题Http status: 200 OK ajaxOptions: parsererror thrownError
- 生产订单总目标成本为0
- 项目经理的十二条规则
- SAP中如何给成本要素分配多个默认成本中心
- NBA史上薪水最高球员排行榜
- 保鲜、保生,生鲜电商的两码事
- 戴尔背书飞贷:创新IT技术直击金融机构互联网转型需求
- 大工17春计算机文化基础在线测试3,大工17春《计算机文化基础》在线测试3答案...
- python输出一个数的每一位_Python练习实例88 | 读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。...
- ajax 同步异步true,async: false 实现AJAX同步请求 ( $.ajax同步/异步(async:false/true) )(示例代码)...