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

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

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

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

  1. 网络延迟的情况下用户多次点击submit按钮导致表单重复提交
  2. 用户提交表单后,点击【刷新】按钮导致表单重复提交(点击浏览器的刷新按钮,就是把浏览器上次做的事情再做一次,因为这样也会导致表单重复提交)
  3. 用户提交表单后,点击浏览器的【后退】按钮回退到表单页面后进行再次提交
    二、防止防止表单重复提交的方式
    1、利用JavaScript防止表单重复提交
    (1)、用JavaScript控制Form表单只能提交一次
    主要代码:
<form action="${pageContext.request.contextPath}/servlet/DoFormServlet" onsubmit="return dosubmit()" method="post"> 
用户名:<input type="text" name="username"> 
<input type="submit" value="提交" id="submit">
</form>
<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)、将提交按钮设置为不可用

主要代码:

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的报错信息,看着有点不爽。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号