前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaWeb防止表单重复提交的几种方式

JavaWeb防止表单重复提交的几种方式

作者头像
全栈程序员站长
发布2022-08-04 17:00:06
2.1K0
发布2022-08-04 17:00:06
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

一、表单重复提交的常见应用场景

  1. 网络延迟的情况下用户多次点击submit按钮导致表单重复提交
  2. 用户提交表单后,点击【刷新】按钮导致表单重复提交(点击浏览器的刷新按钮,就是把浏览器上次做的事情再做一次,因为这样也会导致表单重复提交)
  3. 用户提交表单后,点击浏览器的【后退】按钮回退到表单页面后进行再次提交 二、防止防止表单重复提交的方式 1、利用JavaScript防止表单重复提交 (1)、用JavaScript控制Form表单只能提交一次 主要代码:
代码语言:javascript
复制
<form action="${pageContext.request.contextPath}/servlet/DoFormServlet" onsubmit="return dosubmit()" method="post"> 
用户名:<input type="text" name="username"> 
<input type="submit" value="提交" id="submit">
</form>
代码语言:javascript
复制
<head>
 <title>Form表单</title> 
 <script type="text/javascript"> var isCommitted = false; //表单是否已经提交标识,默认为false function dosubmit(){ 
     if(isCommitted==false){ 
     isCommitted = true; //提交表单后,将表单是否已经提交标识设置为true return true; //返回true让表单正常提交  } else { 
     return false; //返回false那么表单将不提交  } } </script>
</head>

(2)、将提交按钮设置为不可用

主要代码:

代码语言:javascript
复制
function dosubmit(){ 
    
//获取表单提交按钮 
var btnSubmit = document.getElementById("submit"); 
//将表单提交按钮设置为不可用,这样就可以避免用户再次点击提交按钮 
btnSubmit.disabled= "disabled";
 //返回true让表单可以正常提交 
 return true; 
 }

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

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

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

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

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

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

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/106610.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档