点击上方蓝字关注我们

一、背景

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

二、产生原因

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

反复刷新页面

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

浏览器重复的HTTP请求

Nginx重发等三、解决方案

1、前端控制

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

2、借助本地锁实现

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

接下来介绍下具体实现:

引入guava依赖

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

自定义LocalLock注解

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

自定义注解切面

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

控制层实现

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

效果展示

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

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

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

四、总结

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

java 防重复提交_Java中如何避免重复提交请求相关推荐

  1. java arraylist 重复_Java中ArrayList去除重复元素

    Java中ArrayList去除重复元素 //删除ArrayList中重复元素 public   static   void  removeDuplicate(ArrayList list)   { ...

  2. java 文件解析异常_java中异常的解析

    Java Exception: 1.Error 2.Runtime Exception 运行时异常 3.Exception 4.throw 用户自定义异常 异常类分两大类型:Error类代表了编译和系 ...

  3. java list详解_Java 中 list 用法案例详解

    LIST是个容器接口可以理解为动态数组,传统数组必须定义好数组的个数才可以使用,而容器对象无须定义好数组下标总数,用add()方法即可添加新的成员对象,他可以添加的仅仅只能为对象,不能添加基本数据类型 ...

  4. java 对象的交互_Java中什么是对象的交互?解释一下交互怎么操作?

    其实并没有那个复杂.java中对象是什么,你要明白一点就是: 在java中万物皆对象 比如,实体类之间的互相调用,不想访问以及访问其他属性及其方法等. 不论你是线程,还是异步任务,还是...都可以用以 ...

  5. Java set的区别_java中List 和 Set 的区别

    a. 特性 两个接口都是继承自Collection​,是常用来存放数据项的集合,主要区别如下: ① List和Set之间很重要的一个区别是是否允许重复元素的存在,在List中允许插入重复的元素,而在S ...

  6. java set遍历方式_java中的Set的使用以及各种遍历方法(较为全面)

    1. 概述 Java 中的Set和正好和数学上直观的集(set)的概念是相同的.Set最大的特性就是不允许在其中存放的元素是重复的.根据这个特点,我们就可以使用Set 这个接口来实现前面提到的关于商品 ...

  7. java 定义map集合_Java中的Map集合

    Map集合: 个人感觉Map接口以后会经常用到,可以很清晰地查找某个对象,要熟悉其四种遍历方法.特别注意其键值对的键不能是重复的,有想定义有序存取的话,可以使用LinkedHashMap集合.不过定义 ...

  8. java常见检查异常_java中常见异常总汇,附解释

    Java Exception: 1.Error 2.Runtime Exception 运行时异常 3.Exception 4.throw 用户自定义异常 异常类分两大类型:Error类代表了编译和系 ...

  9. java collection详解_Java中的Collection详解

    在使用Java的时候,我们都会遇到使用集合(Collection)的时候,但是Java API提供了多种集合的实现. 总的说来,Java API中所用的集合类,都是实现了Collection接口,他的 ...

  10. java可以多重继承吗_Java中的多重继承与组合vs继承

    java可以多重继承吗 有时我写了几篇有关Java继承,接口和组成的文章. 在这篇文章中,我们将研究多重继承,然后了解组成优于继承的好处. Java中的多重继承 多重继承是创建具有多个超类的单个类的能 ...

最新文章

  1. SQL 语句递归查询 With AS 查找所有子节点
  2. 时间序列研(part3)--单积性
  3. FPGA专有名词的积累
  4. 前端学习(3285):立即执行函数四
  5. Zxing二维码重复扫描,不退出。
  6. Linux中SDIO命令,Linux MMC/SD/SDIO体系结构
  7. matlab ascii 异或,GPS数据包的ASCII异或校验和计算方法(VC++)
  8. C 语言 printf 输出详解
  9. linux 设备驱动初学(一)
  10. Debian 26 岁生日快乐!Happy DebianDay!
  11. 线性代数知识荟萃(3)——行列式
  12. rainmeter 修正天气插件信息不准确 设置居住城市
  13. java mb单位转换_字节、kb、mb等单位,是怎样换算的?
  14. Meta-Tracker(ECCV 2018)视频目标跟踪源码运行笔记——Testing模式
  15. html网页内部超链接介绍
  16. 各省省际对外非金融类直接投资流量情况(2009-2018年)
  17. 如何学会做一名优秀的下属
  18. 为什么iPhone 12 中国版不支持5G毫米波?
  19. 文件操作(第二节文件的写入和读取)
  20. 汉诺塔问题的递归求解

热门文章

  1. 阿里巴巴2020春招暑期实习笔试题
  2. 2021阿里巴巴实习生面试经验
  3. TiDB的设计哲学——Make It Work! Make It Right! Make It Fast!
  4. IDEA 返回上一步,回到下一步 冲突 快捷键设置
  5. 阿里云域名绑定IP手把手教学
  6. html网页在线加密解密工具源码
  7. 怎样png转jpg还可以保持原有大小?
  8. STM32管脚的复用和重定义功能(RCC_APB2Periph_AFIO)
  9. Java实现 蓝桥杯 算法提高 文本加密
  10. hybrid 单臂路由