资讯专栏INFORMATION COLUMN

Java中如何避免重复提交请求

IT那活儿 / 3292人阅读
Java中如何避免重复提交请求

点击上方蓝字关注我们


一、背景


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


二、产生原因


导致重复请求的原因很多,大体为以下几种:

  • 多次点击提交按钮

  • 反复刷新页面

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

  • 浏览器重复的HTTP请求

  • Nginx重发等


三、解决方案


1、前端控制

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

2、借助本地锁实现

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

接下来介绍下具体实现:

引入guava依赖

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

自定义LocalLock注解

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

自定义注解切面

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

控制层实现

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

效果展示

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

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

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


四、总结


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






文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/130024.html

相关文章

  • 表单防重提交详解

    摘要:注意设计模式并不适用所有的重复提交情况,比如由于服务器响应缓慢,用户刷新提交请求造成的重复提交。用户恶意避开客户端预防多次提交手段,进行重复数据提交。 表单重复提交的常见应用场景 1、在网络延迟的情况下让用户又是加你点击多次submit按钮导致 2、表单提交后用户点击刷新按钮导致表单重复提交 3、用户表单提交后,点击浏览器后退按钮退回表单页面后进行再次提交 很多情况下,重复提交的数据,...

    Kross 评论0 收藏0
  • 表单防重提交详解

    摘要:注意设计模式并不适用所有的重复提交情况,比如由于服务器响应缓慢,用户刷新提交请求造成的重复提交。用户恶意避开客户端预防多次提交手段,进行重复数据提交。 表单重复提交的常见应用场景 1、在网络延迟的情况下让用户又是加你点击多次submit按钮导致 2、表单提交后用户点击刷新按钮导致表单重复提交 3、用户表单提交后,点击浏览器后退按钮退回表单页面后进行再次提交 很多情况下,重复提交的数据,...

    Backache 评论0 收藏0
  • 超实用百道Java面试题

    摘要:是的简称,运行环境,为的运行提供了所需的环境。分割字符串,返回分割后的字符串数组。当计算的值相同时,我们称之为冲突,的做法是用链表和红黑树存储相同的值的。迭代器取代了集合框架中的,迭代器允许调用者在迭代过程中移除元素。 Java基础1.JDK和JRE有什么区别? JDK 是java development kit的简称,java开发工具包,提供java的开发环境和运行环境。JRE 是j...

    MkkHou 评论0 收藏0
  • Kafka学习笔记

    摘要:学习笔记使用一个叫的文学家的名字用来命名的。引入,正式升级为分布式流处理平台。主要还是针对组成员数量减少的情况。当所有成员都退出组后,消费者组状态变更为。自动定期删除过期位移的条件就是,组要处于状态。减少下游系统一次性消费的消息总数。 Kafka 学习笔记 Kafka使用一个叫Franz Kafka的文学家的名字用来命名的。 Kafka是一款开源的消息引擎系统。也是一个分布式流处理平台...

    aikin 评论0 收藏0
  • 美团面试题:Java-线程池 ThreadPool 专题详解

    摘要:去美团面试,问到了什么是线程池,如何使用,为什么要用以下做个总结。二线程池线程池的作用线程池作用就是限制系统中执行线程的数量。真正的线程池接口是。创建固定大小的线程池。此线程池支持定时以及周期性执行任务的需求。 去美团面试,问到了什么是线程池,如何使用,为什么要用,以下做个总结。关于线程之前也写过一篇文章《高级面试题总结—线程池还能这么玩?》 1、什么是线程池:  java.util...

    enrecul101 评论0 收藏0
  • 美团面试题:Java-线程池 ThreadPool 专题详解

    摘要:去美团面试,问到了什么是线程池,如何使用,为什么要用以下做个总结。二线程池线程池的作用线程池作用就是限制系统中执行线程的数量。真正的线程池接口是。创建固定大小的线程池。此线程池支持定时以及周期性执行任务的需求。 去美团面试,问到了什么是线程池,如何使用,为什么要用,以下做个总结。关于线程之前也写过一篇文章《高级面试题总结—线程池还能这么玩?》 1、什么是线程池:  java.util...

    wujl596 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<