Form表单重复提交是web开发中一个很常见的问题。先总结以下几种解决方案
模拟Action后台查询数据需要时间等待,此间用户可能会多次点击提交按钮或者刷新页面,此时Action也会反复执行多次,这并不是我们想要的。如下,模拟Action操作。
TestAction.java
public class TestAction { private User user;//省略get/set方法... public String execute() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("-------------业务处理-------------"); System.out.println("user.username--->" + user.getUsername()); System.out.println("user.age--->" + user.getAge()); return "test"; } }
struts.xml
<action name="test" class="com.lydia.web.action.TestAction" > <result name="test">/ognl.jsp</result> <action>
解决方案1:利用javascript脚步
index.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"%> <html> <head> <script type="text/javascript" language="javascript"> var isSubmitFlag = false; function checkSubmit(){ if(!isSubmitFlag){ isSubmitFlag = true; return true; }else{ alert("不能重复提交"); return false; } } </script> </head> <body> This is my JSP page. <br> <form name="form" action="test" method="post" onsubmit="return checkSubmit();"> username : <input name="user.username" /> <br/> age : <input name="user.age " /><br/> <span id="t" style="color: red"></span> <input type="submit" value="提交" id="sub"/> </form> </body> </html>
此种方法通过设置 onsubmit="return false" 来防止表单提交,类似的还可以在第一次提交后把提交按钮设置为不可用;或者显示正在提交中等。
function checkSubmit(){ document.getElementById("tt").innerHTML="提交中..."; document.getElementById("btu").disabled="disabled"; return true; }
解决方案2:struts2的token令牌机制
这种做法非常简单,步骤如下
1)在jsp页面的表单中添加<s:token></s:token>标签。
2)修改struts.xml
a,如果需要错误页面提示,点击多次也只提交一次,但是会跳转到错误页面提示表单重复提交了:
使用token
<action name="test" class="com.tarena.web.action.TestAction" > <result type="dispatcher" name="test">/ognl.jsp</result> <result type="redirect" name="index">/index.jsp</result> <result name="invalid.token">/error.jsp?message=重复提交</result> <interceptor-ref name="token"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action>
b,不需要错误页面提示,即使点击多次也只提交一次。 使用tokenSession
<action name="test" class="com.tarena.web.action.TestAction" > <result type="dispatcher" name="test">/ognl.jsp</result> <result type="redirect" name="index">/index.jsp</result> <interceptor-ref name="tokenSession"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action>
注意:
a:当拦截器拦截到 当发生重复提交的action时候,会跳转到invalid.token指定的页面。
b:为了使用同一的错误页面,在错误页面上接受到message参数的值,可以在error.jsp使用${param['message']}
c:在提交页面的form中添加<s:token/>标签,需要在页面中加上
token的工作原理。我们会发现使用<s:token></s:token>后,jsp页面中会多出:
<input type="hidden" name="struts.token.name" value="struts.token" />
<input type="hidden" name="struts.token" value="HZC4XCH5K9Q3KEXR0D4HZKJI8PYOSAOJ" />
当页面提交的时候时候他会判断这个值是不是和session的一样,如果是一样的,你可以提交,并且会修改session里的值。如果你刷新或重复提交,那你页面上的值和session的值就不一样的,struts就不允许你提交数据了。就是这个原理。
相关推荐
基于 SpringBoot 实现表单重复提交解决方案 表单重复提交是指在一次请求完成之前防止重复提交,解决表单重复提交有多种形式,以下以 Aop+自定义注解+Redis 为例来介绍。 解决方案的详细流程 1. 当页面加载时,...
在IT行业中,尤其是在前端开发领域,防止用户重复提交是一项重要的任务,这有助于避免因网络延迟或用户误操作导致的数据混乱。Element-UI,一个流行的Vue.js组件库,提供了多种方式来处理这个问题。以下是如何在使用...
总结来说,Servlet、Struts和SpringMVC都提供了各自的解决方案来防止表单重复提交,主要方法包括使用Session、令牌机制、重定向和拦截器等。开发者可以根据项目需求选择合适的方式来实现,确保应用的稳定性和数据...
在我们进行Java Web开发时,提交一个action处理请求后(或者提交一个表单后),进行刷新操作,或按F5键时会出现action处理重复执行的情况,数据库中会出现多条同样的记录,解决这种问题的方法有多种,但最安全有效的...
在Web开发中,用户表单重复提交是一个常见的问题,它可能导致数据冗余或者数据库状态的不一致。本示例提供了一种解决方案,包括在前端JavaScript和后端进行处理,以防止用户因网络延迟或误操作导致的多次提交。 ...
本篇文章将深入探讨如何防止表单重复提交,主要关注于基于Struts2框架的解决方案。 首先,理解表单重复提交的原因。用户在点击提交按钮后,如果网络延迟或用户误操作导致页面刷新或再次点击提交,就可能发生重复...
本文将深入探讨Struts2防止重复提交的解决方案,包括拦截器的配置、重复提交的原因以及`token`机制的工作原理。 首先,了解Struts2拦截器的基础知识是至关重要的。在Struts2框架中,拦截器是基于AOP(面向切面编程...
在Web开发中,表单重复提交是一个常见的问题,它可能会导致数据冗余或者不一致,尤其是在处理关键操作如交易、订单或用户注册时。这里我们深入探讨这个问题,并提供解决方案。 标题"表单重复提交问题1"所涉及的核心...
针对表单重复提交问题,网上可以找到多种解决方案。其中比较常见的有两种: 1. **使表单按钮失效**:即在用户点击提交按钮后使其失效,以确保表单只能被提交一次。这种方法虽然简单有效,但用户体验较差,尤其是在...
为了解决这一问题,我们可以采用自定义注解结合Redis来实现一个防止表单重复提交的解决方案。 首先,让我们理解自定义注解的核心思想。注解是一种元数据,它提供了在代码中添加信息的方式,这些信息可以被编译器或...
防止表单重复提交的方法通常有两种:客户端解决方案和服务器端解决方案。 1. 客户端解决方案: - JavaScript禁用提交按钮:在提交表单时,可以通过JavaScript立即禁用提交按钮,避免用户连续点击。 - 使用Ajax...
在Web开发中,防止表单重复提交是一个重要的问题,它能确保用户操作的唯一性和数据的一致性。ThinkPHP 3.2 是一个基于MVC模式的PHP开发框架,提供了丰富的功能来帮助开发者构建安全、高效的应用。在这个场景中,我们...
这个案例不仅提供了使用图表插件的方法,还包含了防止表单重复提交的解决方案。 首先,我们要理解图表插件的作用。图表插件通常是一些JavaScript库或Java后端组件,如Highcharts、ECharts、JFreeChart等,它们能够...
总的来说,防止用户多次重复提交是一个多维度的解决方案,需要前端、后端和数据库共同协作。前端通过禁用按钮防止用户快速点击,后端通过session或token机制确保请求的独特性,数据库则作为最后一道防线,确保数据的...
在Web开发中,表单重复提交是一个常见的问题,它可能导致数据的不一致性或者服务端处理逻辑的混乱。Struts2框架提供了一种解决方案,即使用Token机制来防止表单的重复提交。以下是对这个主题的详细说明: 1. **表单...