防止form表单重复提交(java后端解决重复提交问题)

在javaweb方向做开发的小伙伴们,肯定都会遇到表单重复提交的问题。

这种问题出现的原因或者说应用场景大致如下:

  1. 网络延迟,服务器未能及时做出响应,导致用户不断重复点击提交按钮

  2. 用户双击有意识的双击或者多次点击提交按钮

  3. F5刷新页面

  4. 点击浏览器后退按钮

归根结底,都是由于浏览器重复发起HTTP请求所致。

那么处理的方法有哪些呢?

于是搜集了下网上一些方法,方便以后查看。同时也可以给小伙伴儿们参考参考,避免走一些弯路。

其中的方法,有些是鄙人在实际工作中亲自用到过。

有些虽并未用到,但是从解决思路上来说,也是行之有效的。

解决方案主要分为客户端(浏览器)和服务端以及数据库。

  • js禁用提交按钮

这种方式是一种比较简单也比较常用的方法。当用户提交完表单后,用javascript禁用提交按钮让按钮不可点击。也就是设置disabled属性为disabled或者true即可。

  • 按钮倒计时

页面上表单提交后,将按钮置灰不可点击后加入倒计时,比如5秒或者10秒后按钮恢复点击状态才能再次提交。这种方式也可以避免大量请求,减轻服务端访问的压力。

  • 验证码

页面上添加验证码,不管验证输入正确与否,提交后均刷新验证码。

  • ajax提交加锁

采用ajax方式提交表单时,设置一个布尔变量(true/false),当然其他类型变量也可以。初始时为true可以提交,在前端向服务器发出请求后,服务端响应结果没有回来之前将该值置为false,正常响应时再置为true。

  • 提交后重定向到一个提交成功的页面

表单提交后跳转到另外一个成功页面。这样可以避免用户按F5导致的重复提交,浏览器也不会出现表单重复提交的警告,以及消除按浏览器前进和后退按导致的同样问题。

  • 服务端生成一个唯一的token

首先在服务端生成一个token保证唯一性,然后将这个token保存在session或者redis等缓存中。与此同时将token放到页面的隐藏input中,发给浏览器。用户在页面上提交时带着这个token一块提交到服务端,服务端通过比对token的值。如果相等代表首次提交,此时将session或者缓存中保存的token值remove掉,反之则认为重复提交,服务端不予处理。

  • cookie记录表单提交的状态

使用Cookie记录表单提交的状态,根据其状态可以检查是否已经提交过表单。跟上一种类似,服务端生成token存入Cookie,表单提交时将Cookie中token和服务端token比对。

  • 数据库添加唯一索引约束

向数据库字段添加一个唯一索引。如果表单重复提交,那么数据库插入重复记录时,唯一约束能有效避免重复入库。这样控制的话,日志会出现Your program attempts to store duplicate values in a database column that is constrained by a unique index的报错信息,看着有点不爽。

大概也就这些吧,如有大神有更好的解决方法还往不吝赐教。

一般建议这些前后端方法共同结合的双重机制来保证重复提交的问题。

如果真正重复提交了,后端始终返回同样结果,也就是保证提交操作的幂等性。

这样就确保万无一失啦。

(0)

相关推荐

  • Linux以form表单形式上传文件讲解

    先cd到要上传文件的目录下: root@iZ2zee1przeygbuu4rkwvxZ:/usr/local/test# ls 1.png DSC_0192.JPG test.apk 使用curl - ...

  • HTML button标签在form表单内,点击重新加载

    本篇主要是测试form内的button按钮问题 form内的button按钮点击后,网页重新加载了. 本人新手,用于学习记录,有错误请指出,只有这样才能共同进步,谢谢! 操作方法 01 form标签的 ...

  • 怎样用html写一个简洁的提交表单?

    怎样用html写一个简洁的提交表单? 操作方法 01 新建一个html文件,写上html的头部. 02 写上form表单的外壳.<form></form> 03 为form这个 ...

  • html表单的提交,单选和多选按钮,隐藏域的编写

    我们经常在html中用到表单,可以说传递信息的一种渠道.我们通过用到checkbox关键字来显示多选框,而使用radio关键字来代表单选,还有个用hidden表示隐藏域.下面看看代码. 操作方法 01 ...

  • 【DDC译文】创建用户友好型表单

    表单对于企业和个人同样至关重要,当涉及到数据收集时,我们大多数情况下会采用表单(或许是因为在互联网繁荣之前我们就已经在线下使用了很久的表单).因此建立一个用户友好的表单是增加填写完成率的关键. 表单解 ...

  • 掌握8个要点,设计友好的表单!

    表单对于产品来讲非常重要,它可以有效快捷地收集我们需要的用户信息. 因此,设计一个对用户十分友好的表单能够使表单的填写完成率得到立竿见影的提升. 表单结构 虽然表单类型多样,有不同目的的.收集不同内容 ...

  • HTML中的表单

    表单结构,文本栏.密码栏.隐藏栏.复选栏.单选栏.窗体栏位.区块栏位.按钮.图像按钮.允许上传文件.表单的外框和标题.元件的次序和快捷键. 操作方法 01 表单结构: <form>...& ...

  • Html 表单标签元素

    Html form 表单区域标签元素 form表单目录 Form表单区域标签语法与结构 Form表单区域标签使用说明 案例html代码 DW软件里截图 html form表单总结 操作方法 01 Fo ...

  • 学习html制作网页:表单试题及代码

    HTML中的表单大多数用form表单来收集用户的数据,将用户填写的数据通过get或者post的方式传递出去,下面简单介绍form表单中的几种常见的标签 操作方法 01 新建一个HTML文件,命名为my ...