java 防重复提交_Java中如何避免重复提交请求

abbd6355d7ffad3b41c9f7de495543b5.pngabbd6355d7ffad3b41c9f7de495543b5.png点击上方蓝字关注我们abbd6355d7ffad3b41c9f7de495543b5.png

一、背景

我们在使用系统过程中,经常碰到这种情况:网页响应很慢,提交请求后发现没反应,然后就会反复点击提交按钮。查看后台日志后发现一个同样的请求提交了多次,后果就是轻则导致产生多条重复数据,重则直接导致程序异常。那么,有没有什么办法可以避免这种问题呢?

二、产生原因

导致重复请求的原因很多,大体为以下几种:多次点击提交按钮

反复刷新页面

点击浏览器后退按钮,导致重复提交表单

浏览器重复的HTTP请求

Nginx重发等三、解决方案

1、前端控制

前端提交请求后,在等待结果返回前将提交按钮禁用,可以阻止人为的反复点击操作。但是这种方式只能控制页面,如果通过工具多次提交请求,那就只能通过后端来实现限制了。

2、借助本地锁实现

这种方式主要通过自定义注解、springaop、guavacache来生成本地锁,达到防止重复提交的效果。

接下来介绍下具体实现:

引入guava依赖

Guava是谷歌开源的Java库,这个库提供用于集合,缓存,支持原语,并发性,常见注解,字符串处理,I/O和验证的实用方法,对JDK工具做了很好扩展。

7dbf94f72227c367c5e61518a0f11220.png

自定义LocalLock注解

编写自定义注解,用于需要控制重复提交的方法上。

fbc773918074c31a543bd3ec24fad56d.png

自定义注解切面

编写自定义注解的aop拦截器具体实现,读取有LocalLock注解的方法,解析注解中定义的key值在本地缓存中是否存在,若存在则提示重复请求,若为第一次请求则将key存入本地缓存中。

b7672acd31da7353ff615647e6f0c73a.png

ccb203d08e4a8c8dbf20e6836b72f4ed.png

控制层实现

在需要限制重复提交的方法上加入@LocalLock注解,其中key值为自定义的存入缓存中的key。

777868a7da029186482f6dcdb7cab9c8.png

效果展示

启动应用,访问上面的/query请求查看效果。

正常访问一下,结果如下:

02aee9958638016f5206225dd3a7b3ff.png

接下来,在正常访问过程中,重复点击提交,可以看到已达到限制效果。

e3639978743becf4332a04d17d0cc9ac.png

四、总结

对于重复提交请求的问题,我们单纯的只从前端或后端控制,带来的用户体验都不是最好的。只有两者结合起来,才能在确保功能正常的前提下,保证用户体验效果。

052683de4603826db2ed41bbbad17a56.png

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页

打赏作者

鲨鱼飞不动了

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值