OurDotNetLogo

程序员,.NET平台,.NET学习,CSharp学习,OurDotNet,程序员,.NET平台,.NET学习,CSharp学习,OurDotNet

web防止表单重复提交的几种解决方案
作者:码农的搬砖生涯  |   2018/3/27 8:41:48   |  阅读:1934

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

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

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

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

  3. F5刷新页面

  4. 点击浏览器后退按钮

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

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

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

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

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

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

javaweb防止表单重复提交的几种解决方案

  • 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) 踩(0)

圈内热点

  • 怎么轻松学习JavaScript

    js给初学者的印象总是那么的“杂而乱”,相信很多初学者都在找轻松学习js的途径。我试着总结自己学习多年js的经验,希望能给后来的学习者探索出一条“轻松学习js之路”。
  • 我心目中的ASP.NET核心对象

    在我的眼里,Asp.net有三大核心对象:HttpContext, HttpRequest, HttpResponse。除此之外,还有二个对象虽然称不上核心,但仍然比较重要:HttpRuntime,HttpServerUtility
  • IIS内部运行机制

    这篇文章的资料收集整理自各种微软公开的文档,通过比较 IIS5、IIS6、IIS7 这三代 IIS 对请求的处理过程, 让我们熟悉 ASP.NET的底层机制并对请求(request)是怎么从Web服务器传送到ASP.NET运行时有所了解
  • 改善程序员生活质量的3+10习惯

    2017年的一天,代码伴随着手指极具节奏感地输出在IDE上,突然某Chrome插件弹出一封邮件提示:“今天是我在ThoughtWorks的最后一天”。
  • 编程的一些伟大真理

    编程学习中的一些伟大真理,初级程序员都知道吗?
回到顶部