防止表单重复提交思路分析

出现重复提交的场景一般是在网速比较慢,服务器返回时间较长,导致用户以为没有提交成功或者习惯性的多点几次提交按钮。开发中必须杜绝重复提交问题。

一、出现重复提交表单的场景

场景一:在网络延迟的情况下让用户有时间点击多次submit按钮导致表单重复提交;

场景二:表单提交后用户点击【刷新】按钮导致表单重复提交;

场景三:用户提交表单后,点击浏览器的【后退】按钮回退到表单页面后进行再次提交。

二、利用JavaScript防止表单重复提交

除了用这种方式之外,经常见的另一种方式就是表单提交之后,将提交按钮设置为不可用,让用户没有机会点击第二次提交按钮,代码如下:

使用JavaScript防止表单重复提交的做法只对上述提交到导致表单重复提交的三种场景中的【场景一】有效,而对于【场景二】和【场景三】是没有用,依然无法解决表单重复提交问题。

三、利用Session防止表单重复提交

对于【场景二】和【场景三】导致表单重复提交的问题,既然客户端无法解决,那么就在服务器端解决,在服务器端解决就需要用到session了。

具体的做法: 在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
在下列情况下,服务器程序将拒绝处理用户提交的表单请求:

四、利用redis锁机制

key值可以是请求路径+用户的唯一标识,在finally中释放锁或者结合设置key过期时间。

另外,防止用户重复支付也可以应用,key为订单号,配合数据库订单支付状态查询判断。幂等性接口设计。

Original: https://www.cnblogs.com/better-farther-world2099/p/10495322.html
Author: 奕锋博客
Title: 防止表单重复提交思路分析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/571754/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 深入浅出的分析 Hashtable

    作者:炸鸡可乐原文出处:www.pzblog.cn 一、摘要 在集合系列的第一章,咱们了解到,Map 的实现类有 HashMap、LinkedHashMap、TreeMap、Ide…

    Java 2023年6月9日
    0125
  • Elasticsearch和Solr的区别

    1、基于Lucene开发 java;gutter:true; 他们底层都是基于Lucene开发,使用了Lucene的倒排索引实现的</p> <pre>&lt…

    Java 2023年6月13日
    074
  • harbor安装实操笔记

    纸上得来终觉浅,实操一遍吧! 把所有开发的后端服务先在打成镜像,传到私有镜像仓库; 然后在任意的远程机器拉取镜像,然后可采用docker或者docker-compose的方式运行,…

    Java 2023年6月8日
    073
  • JAVA面向对象的三大主线

    1、类及类的成员:属性、对象、构造器、代码块、内部类 2、特性:封装、继承、多态 3、其它关键字 面向过程:主要考虑解决问题,以函数为最小单位,考虑怎么做 面向对象:主要考虑谁去做…

    Java 2023年6月15日
    080
  • WPF 自定义可拖动标题栏

    要注意,拖拽的地方,需要加背景色,否则 DrageMove 将无效 MainWindows.xaml <Window x:Class="Report.MainWin…

    Java 2023年6月14日
    071
  • 利用MySQL实现分布式锁,涉及到乐观锁和悲观锁的思想

    对于一些并发量不是很高的场景,使用MySQL来实现分布式锁会比较精简且巧妙。 下面就一个小例子,针对不加锁、乐观锁以及悲观锁这三种方式来实现。 主要是一个用户表,它有一个年龄的字段…

    Java 2023年6月8日
    0182
  • Java中的IO流

    IO流的分类 按照数据类型划分:字符流和字节流 按照数据流向划分:输入流和输出流 对于纯文本数据,优先使用字符流。除此之外都使用字节流。 File类 java.io.File:不能…

    Java 2023年6月9日
    070
  • IntelliJ IDEA中如何优雅的调试Java Stream操作

    Stream操作是Java 8推出的一大亮点!虽然 java.util.stream很强大,但依然还是有很多开发者在实际工作中很少使用,其中吐槽最多的一个原因就是不好调试,一开始确…

    Java 2023年6月9日
    098
  • nginx+tomcat+java部署总结

    昨天部署了一下nginx+tomcat+java出现了很多问题,以下为整理总结。 使用了两种部署方式,一种是源码部署,一种是war部署。 java源码部署总结: 环境:nginx+…

    Java 2023年5月29日
    072
  • Git rebase 合并多次提交

    在一般研发管理流程中,我们一般都是这么使用Git版本的: 0、先拿到一个需求(不细谈需求前面的采集、归纳整理、确认及评审等环节) 1、从主分支checkout一个新分支 2、在完成…

    Java 2023年6月6日
    073
  • v-if判断是否包含字符串

    csharp;gutter:true;删除 signature:祸兮福所倚,福兮祸所伏 Original: https://www.cnblogs.com/xnuuuu/p/132…

    Java 2023年6月9日
    081
  • [学习笔记] Java接口

    接口是Java中的一种抽象类型,是抽象方法的集合; 接口使用 interface关键字声明; 接口不是类,它们属于不同的概念,类描述对象的属性和方法,接口则包含要实现的方法; 一个…

    Java 2023年6月5日
    076
  • IDEA通用配置

    文件的自动author注释 posted @2020-09-18 16:54 风小雅 阅读(197 ) 评论() 编辑 Original: https://www.cnblogs….

    Java 2023年6月6日
    085
  • Oracle在操作系统层面kill所有session的语句

    原理,通过kill连接对应的进程来kill所有session。执行命令如下: ps -ef | grep LOCAL=NO | grep -v grep | awk ‘…

    Java 2023年5月30日
    069
  • 叫练手把手教你读JVM之GC信息

    众所周知,GC主要回收的是堆内存,堆内存中包含年轻代和老年代,年轻代分为Eden和Surivor,如下图所示。我们用案例分析下堆的GC信息【版本: HotSpot JDK1.8】。…

    Java 2023年6月8日
    070
  • YOLOX 0.1.0 环境配置

    YOLOX训练自己的数据集 一、准备数据集 配置好Pascal VOC格式的数据集,放入datasets文件夹下,或者跟项目名在同一级目录下也行。VOC数据集的格式为: VOCde…

    Java 2023年6月15日
    067
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球