-
2021-06-25 02:25:00
产生原因:
网络延时、重新刷新、点击浏览器的【后退】按钮回退到表单页面后进行再次提交
前端
点击铔之后,按变灰
标识
2.后瑞
使用 token
1,使用令牌好处唯一性只能有一次请求
web 安全知识点使用令解决模拟请求我現在把这个生 token 方式知道,还是能被模拟?模拟程序使用验证码模拟请求识别验证码是非常难token+验证码使用 javascript 解决既然存在上述所说的表单重复提交问题,那么我们就要想办法解决,比较常用的方法是采用 JavaScript 来防止表单重复提交,具体做法如下:修改 form.jsp 页面,添加如下的 JavaScript 代码来防止表单重复提交
var isFlag = false; //表单是否已经提交标识,默认为false
function submitFlag() {
if (isFlag == false) {
isFlag = true;
return true;
} else {
return false;
}
}
method="post" οnsubmit="return submitFlag()">
用户名:
更多相关内容 -
表单重复提交解决方案
2020-04-07 10:37:38表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如:1. 点击提交按钮两次。2. 点击刷新按钮。3. 使用浏览器后退按钮重复之前的操作,导致重复提交表单。...表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如:1. 点击提交按钮两次。2. 点击刷新按钮。3. 使用浏览器后退按钮重复之前的操作,导致重复提交表单。4. 使用浏览器历史记录重复提交表单。5. 浏览器重复的HTTP请求。
用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数据库中,这是一个比较棘手的问题。我们可以从客户端和服务器端一起着手,设法避免同一表单的重复提交。
一. 服务端解决方法
1. 在session中存放一个特殊标志。
在服务器端,生成一个唯一的标识符,将它存入session,同时将它写入表单的隐藏字段中,然后将表单页面发给浏览器,用户录入信息后点击提交,在服务器端,获取表单中隐藏字段的值,与session中的唯一标识符比较,相等说明是首次提交,就处理本次请求,然后将session中的唯一标识符移除;不相等说明是重复提交,就不再处理。这使你的web应用有了更高级的XSRF保护。
2. 使用header函数转向。
那就是当用户提交表单,服务器端处理后立即转向其他的页面。
这样,即使用户使用刷新键,也不会导致表单的重复提交,因为已经转向新的页面,而这个页面脚本已经不理会任何提交的数据了。3. 借助数据库。
insert使用唯一索引, update使用 乐观锁/悲观锁 version版本法
二. 客户端解决方法
1. js禁掉提交按钮。
表单提交后使用Javascript使提交按钮disable。这种方法防止心急的用户多次点击按钮。但有个问题,如果客户端把Javascript给禁止掉,这种方法就无效了。
2. 使用Post/Redirect/Get模式。
在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。
这能避免用户按F5导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题。三、实例代码
以Bootstrap插件为例:
1.在按钮中加入data-loading-text,即点击按钮后显示的文字
<button type="submit" class="btn btn-primary btn-check" data-loading-text="保存中...">保存</button>
2.当点击按钮后禁用按钮,并显示data-loading-text文字
$(".btn-check").click(function () { $(this).button('loading');//禁用按钮并显示提交中 // $(this).button('reset');//重置按钮 });
3.效果
-
几种防止表单重复提交的方法
2021-01-08 20:00:29表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如: 点击提交按钮两次。 点击刷新按钮。 使用浏览器后退按钮重复之前的操作,导致重复提交表单。 使用... -
防止表单重复提交的解决方案整理
2021-03-15 03:51:08用户在操作表单Post数据时往往会出现表单数据重复提交的问题,尤其在Web开发中此类问题比较常见。刷新页面,后退操作以前的页面,单机多次按钮都会导致数据重复提交。此类问题是因为浏览器重复提交HTTP请求导致。...用户在操作表单Post数据时往往会出现表单数据重复提交的问题,尤其在Web开发中此类问题比较常见。刷新页面,后退操作以前的页面,单机多次按钮都会导致数据重复提交。此类问题是因为浏览器重复提交HTTP请求导致。
下面列出了四种比较常用的解决方案:
1
在数据库添加唯一字段
在数据库建表的时候在ID字段添加主键约束,账号,名称的信息添加唯一性约束。确保数据库只可以添加一条数据。
此方法从根本上的防止了数据重复提交。
2
用js为添加按钮禁用
当用户提交表单之后,可以使用js将提交按钮隐藏(disable属性),防止用户多次点击按钮提交数据。
注意:如果客户端禁用了js,则此方法无效。
3
使用Post/Redirect/Get
Post/Redirect/Get简称PRG,是一种可以防止表单数据重复提交的一种Web设计模式,像用户刷新提交响应页面等比较典型的重复提交表单数据的问题可以使用PRG模式来避免。例如:当用户提交成功之后,执行客户端重定向,跳转到提交成功页面。
注意:PRG设计模式并不适用所有的重复提交情况,比如:
1)由于服务器响应缓慢,用户刷新提交POST请求造成的重复提交。
2)用户点击后退按钮,返回到数据提交界面,导致的数据重复提交。
3)用户多次点击提交按钮,导致的数据重复提交。
4)用户恶意避开客户端预防多次提交手段,进行重复数据提交。
4
使用Session设置令牌
客户端请求页面时,服务器为每次产生的Form表单分配唯一的随机标识号,并且在orm的一个隐藏字段中设置这个标识号,同时在当前用户的Session中保存这个标识号。当提交表单时,服务器比较hidden和session中的标识号是否相同,相同则继续,处理完后清空Session,否则服务器忽略请求。
注意:恶意用户可利用这一性质,不断重复访问页面,以致Session中保存的标识号不断增多,最终严重消耗服务器内存。可以采用在Session中记录用户发帖的时间,然后通过一个时间间隔来限制用户连续发帖的数量来解决这一问题。
-
详谈表单重复提交的三种情况及解决方法
2020-08-29 16:54:49下面小编就为大家带来一篇详谈表单重复提交的三种情况及解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
表单重复提交解决方案(防止Http重复提交
2018-09-22 08:06:52表单重复提交解决方案(防止Http重复提交 场景模拟 创建一个from.jsp页面 &lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding=&...表单重复提交解决方案(防止Http重复提交
场景模拟
创建一个from.jsp页面<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Form表单</title> </head> <body> <form action="${pageContext.request.contextPath}/DoFormServlet" method="post"> 用户名:<input type="text" name="userName"> <input type="submit" value="提交" id="submit"> </form> </body> </html>
DoFormServlet 代码
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/DoFormServlet") public class DoFormServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); String userName = req.getParameter("userName"); try { Thread.sleep(300); } catch (Exception e) { // TODO: handle exception } System.out.println("往数据库插入数据...."+userName); resp.getWriter().write("success"); } }
网络延时
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交。
重新刷新
表单提交后用户点击【刷新】按钮导致表单重复提交
点击浏览器的【后退】按钮回退到表单页面后进行再次提交
用户提交表单后,点击浏览器的【后退】按钮回退到表单页面后进行再次提交解决方案 使用javascript 解决
既然存在上述所说的表单重复提交问题,那么我们就要想办法解决,比较常用的方法是采用JavaScript来防止表单重复提交,具体做法如下:
修改form.jsp页面,添加如下的JavaScript代码来防止表单重复提交
代码:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Form表单</title> <script type="text/javascript"> var isFlag = false; //表单是否已经提交标识,默认为false function submitFlag() { if (!isFlag) { isFlag = true; return true; } else { return false; } } </script> </head> <body> <form action="${pageContext.request.contextPath}/DoFormServlet" method="post" onsubmit="return submitFlag()"> 用户名:<input type="text" name="userName"> <input type="submit" value="提交" id="submit"> </form> </body> </html>
除了用这种方式之外,经常见的另一种方式就是表单提交之后,将提交按钮设置为不可用,让用户没有机会点击第二次提交按钮,代码如下:
function dosubmit(){ //获取表单提交按钮 var btnSubmit = document.getElementById("submit"); //将表单提交按钮设置为不可用,这样就可以避免用户再次点击提交按钮 btnSubmit.disabled= "disabled"; //返回true让表单可以正常提交 return true; }
使用后端提交解决
对于【场景二】和【场景三】导致表单重复提交的问题,既然客户端无法解决,那么就在服务器端解决,在服务器端解决就需要用到session了。
具体的做法:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。在下列情况下,服务器程序将拒绝处理用户提交的表单请求:
1.存储Session域中的Token(令牌)与表单提交的Token(令牌)不同。
2.当前用户的Session中不存在Token(令牌)。
3.用户提交的表单数据中没有Token(令牌)。转发代码:
@WebServlet("/ForwardServlet") public class ForwardServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getSession().setAttribute("sesionToken", TokenUtils.getToken()); req.getRequestDispatcher("form.jsp").forward(req, resp); } }
转发页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Form表单</title> </head> <body> <form action="${pageContext.request.contextPath}/DoFormServlet" method="post" onsubmit="return dosubmit()"> <input type="hidden" name="token" value="${sesionToken}"> 用户名:<input type="text" name="userName"> <input type="submit" value="提交" id="submit"> </form> </body> </html>
后端Java代码:
@WebServlet("/DoFormServlet") public class DoFormServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); boolean flag = isFlag(req); if (!flag) { resp.getWriter().write("已经提交..."); System.out.println("数据已经提交了.."); return; } String userName = req.getParameter("userName"); try { Thread.sleep(300); } catch (Exception e) { // TODO: handle exception } System.out.println("往数据库插入数据...." + userName); resp.getWriter().write("success"); } public boolean isFlag(HttpServletRequest request) { HttpSession session = request.getSession(); String sesionToken = (String) session.getAttribute("sesionToken"); String token = request.getParameter("token"); if (!(token.equals(sesionToken))) { return false; } session.removeAttribute("sesionToken"); return true; } }
-
Java Web表单重复提交的解决方案
2014-02-20 08:57:18在我们进行Java Web开发时,提交一个action处理请求后(或者提交一个表单后),进行刷新操作,或按F5键时会出现action处理重复执行的情况,数据库中会出现多条同样的记录,解决这种问题的方法有多种,但最安全有效的... -
javaweb防止表单重复提交的几种解决方案
2021-02-28 12:54:01展开全部1.js方法解决:关于js方法解决就是说通过js动态控制提交按钮不能多次点击,或者e69da5e887aa...方案一:通过设立标识使表单不能重复提交:var flag=true; function Sub(){ if(flag){flag = false;docum... -
解决表单重复提交问题
2022-02-20 21:27:31解决表单重复提交问题 -
java web 防止表单重复提交解决方案
2015-12-05 10:48:25在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交。 一、表单重复... -
6.表单重复提交问题解决
2022-03-13 12:29:05表单重复提交有三种常见的情况: 提交完表单。服务器使用请求转来进行页面跳转。这个时候,用户按下功能键F5,就会发起最后一次的请求。造成表单重复提交问题。解决方法:使用重定向来进行跳转。 用户正常提交服务器... -
java Web防止表单重复提交危害及解决方案 token机制详解
2020-02-28 01:00:21token机制详解 注:文内关于使用验证码图片的代码请参考我的另一篇博客 java Web项目中导入验证码图片功能步骤详解 ...解决方案:将转发改为重定向即可 2)由于网速或服务器的性能,导致处理请求满,用户重复点... -
Java web解决表单重复提交问题
2021-01-21 17:16:11首先我们在讨论如何解决表单重复提交问题之前先来解决三个问题:1.什么叫表单重复提交?2.什么情况下会出现表单重复提交?3.什么情况需要避免表单重复提交? 什么叫表单提交问题,说白了,是同一份信息,重复的... -
表单重复提交解决方案(防止Http重复提交)
2018-10-12 22:09:50表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如: 点击提交按钮两次。 点击刷新按钮。 使用浏览器后退按钮重复之前的操作,导致重复提交表单。 使用... -
java表单重复提交常用解决办法
2021-02-25 20:07:00为了避免这种情况,总结了一下4点处理方案表单重复提交 常用解决办法。1.通过前端解决(请参考以下的前端代码)2.让提交按钮只触发一次(当用户点击提交后,再次点击的时候不允许调用后台接口,和3类似)3.提交按钮变灰4.... -
springboot解决form表单重复提交方案
2019-05-17 11:15:57在实际业务系统应用过程中,都会存在一个表单数据重复提交的问题。针对这个问题网上也存在N多种解决方案。 为节省选择时间,因此在这N多种方案中,我整理了自认为从根本上解决重复提交的问题的一个最优方案。 ... -
解决vue 按钮多次点击重复提交数据问题
2020-12-02 12:29:38这个其实是一个很细节的问题。 如果我们操作一个按钮,然后在按钮点击的... 事件分为两种情况: •第一种: 不操作数据型 •第二种: 操作数据型 <button @click="submit()" :disabled="isDisable">... submit() -
解决表单重复提交的解决方案——在服务端对Token进行验证
2019-12-26 20:05:51解决表单重复提交的解决方案——在服务端对Token进行验证 1、在idea中建立一个springboot项目 2、在templates目录下建立一个index.html文件 <!DOCTYPE html> <... xmlns:contex... -
表单重复提交问题解决办法
2020-06-19 22:04:10一、出现表单重复提交的原因 二、解决问题的办法 (1)从前台解决 (2)从后台解决 -
Servlet、Struts、SpringMVC对于表单重复提交的解决方案
2018-04-09 10:32:31Servlet、Struts、SpringMVC对于表单重复提交的解决方案 -
解决表单重复提交的简单方法
2018-07-26 16:38:47在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交。 一、表单重复... -
Java开发防止表单重复提交三大解决方案
2015-02-05 10:48:151、什么是重复提交及重复提高带来的什么问题 在开发中,有很多也没设计表单数据的提交,如登录、注册等等;但如果用户点击了『登录』或『注册』时,点击浏览器『刷新按钮』刷新页面,如果不做处理此时会对同一组数据... -
解决表单重复提交的问题
2017-07-20 20:16:34现象描述最近在开发的时候,遇见这样的问题,当我们在网络状况不太好的情况、或者一个业务的后台业务逻辑执行时间较长的时候,用户可能会点击多次提交或刷新多次页面,导致表单数据被提交了多次,导致了可能出现... -
Vue防止表单重复提交
2019-06-13 09:26:13,可能会导致表单重复提交(反正我是遇到过), 应该 setTimeout(function () { //alert(2); v.isDisabled = false; },3000); 给个延迟时间。 第二种效果,按钮只能点击一次,第二次点击没有反应 -
【重复提交表单】表单重复提交的三种情况,解决办法
2019-08-28 16:43:57第一种情况:提交完表单以后,不做其他操作,直接刷新页面,表单会提交多次。 在servlet中写一句输出,用来判断是否提交多次 System.out.println("已经插入"); request.getRequestDispatcher("/login_success.jsp").... -
防止表单重复提交的4种方法
2021-12-01 16:02:21这些情况都会导致表单重复提交,造成数据重复,增加服务器负载,严重甚至会造成服务器宕机。因此有效防止表单重复提交有一定的必要性。 2.解决方案 2.1 通过JavaScript屏蔽提交按钮(不推荐) 通过js代码,当用户... -
java面试 - 后台如何防止表单重复提交?
2022-03-04 07:11:34方案一:利用Session防止表单重复提交 方案二:判断请求url的数据是否和上一次相同 方案三:利用Spring AOP 和redis的锁来实现防止表单重复提交 .... -
表单重复提交问题解决方案
2018-09-18 17:10:252.网速较慢的情况,我们让表单中的提交按钮只能提交一次,然后就不能再次点击了 <form action="FormServlet" method="post"> <input type="text" name="...