`

表单重复提交解决方案

 
阅读更多

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就不允许你提交数据了。就是这个原理。

 

参考文章:http://kingpingping.iteye.com/blog/1168254

分享到:
评论

相关推荐

    基于springboot实现表单重复提交.docx

    基于 SpringBoot 实现表单重复提交解决方案 表单重复提交是指在一次请求完成之前防止重复提交,解决表单重复提交有多种形式,以下以 Aop+自定义注解+Redis 为例来介绍。 解决方案的详细流程 1. 当页面加载时,...

    element-ui如何防止重复提交的方法步骤

    在IT行业中,尤其是在前端开发领域,防止用户重复提交是一项重要的任务,这有助于避免因网络延迟或用户误操作导致的数据混乱。Element-UI,一个流行的Vue.js组件库,提供了多种方式来处理这个问题。以下是如何在使用...

    Servlet、Struts、SpringMVC对于表单重复提交的解决方案

    总结来说,Servlet、Struts和SpringMVC都提供了各自的解决方案来防止表单重复提交,主要方法包括使用Session、令牌机制、重定向和拦截器等。开发者可以根据项目需求选择合适的方式来实现,确保应用的稳定性和数据...

    Java Web表单重复提交的解决方案

    在我们进行Java Web开发时,提交一个action处理请求后(或者提交一个表单后),进行刷新操作,或按F5键时会出现action处理重复执行的情况,数据库中会出现多条同样的记录,解决这种问题的方法有多种,但最安全有效的...

    防止用户表单重复提交处理

    在Web开发中,用户表单重复提交是一个常见的问题,它可能导致数据冗余或者数据库状态的不一致。本示例提供了一种解决方案,包括在前端JavaScript和后端进行处理,以防止用户因网络延迟或误操作导致的多次提交。 ...

    防止表单重复提交

    本篇文章将深入探讨如何防止表单重复提交,主要关注于基于Struts2框架的解决方案。 首先,理解表单重复提交的原因。用户在点击提交按钮后,如果网络延迟或用户误操作导致页面刷新或再次点击提交,就可能发生重复...

    Struts2防止重复提交解决方案

    本文将深入探讨Struts2防止重复提交的解决方案,包括拦截器的配置、重复提交的原因以及`token`机制的工作原理。 首先,了解Struts2拦截器的基础知识是至关重要的。在Struts2框架中,拦截器是基于AOP(面向切面编程...

    表单重复提交问题1

    在Web开发中,表单重复提交是一个常见的问题,它可能会导致数据冗余或者不一致,尤其是在处理关键操作如交易、订单或用户注册时。这里我们深入探讨这个问题,并提供解决方案。 标题"表单重复提交问题1"所涉及的核心...

    ASP.NET中防止刷新页面造成表单重复提交

    针对表单重复提交问题,网上可以找到多种解决方案。其中比较常见的有两种: 1. **使表单按钮失效**:即在用户点击提交按钮后使其失效,以确保表单只能被提交一次。这种方法虽然简单有效,但用户体验较差,尤其是在...

    自定义注解解决API接口幂等设计防止表单重复提交(生成token存放到redis中)

    为了解决这一问题,我们可以采用自定义注解结合Redis来实现一个防止表单重复提交的解决方案。 首先,让我们理解自定义注解的核心思想。注解是一种元数据,它提供了在代码中添加信息的方式,这些信息可以被编译器或...

    jsp项目放置表单重复提交

    防止表单重复提交的方法通常有两种:客户端解决方案和服务器端解决方案。 1. 客户端解决方案: - JavaScript禁用提交按钮:在提交表单时,可以通过JavaScript立即禁用提交按钮,避免用户连续点击。 - 使用Ajax...

    thinkphp3.2 防止表单重复提交

    在Web开发中,防止表单重复提交是一个重要的问题,它能确保用户操作的唯一性和数据的一致性。ThinkPHP 3.2 是一个基于MVC模式的PHP开发框架,提供了丰富的功能来帮助开发者构建安全、高效的应用。在这个场景中,我们...

    图表插件禁止表单重复提交的案例

    这个案例不仅提供了使用图表插件的方法,还包含了防止表单重复提交的解决方案。 首先,我们要理解图表插件的作用。图表插件通常是一些JavaScript库或Java后端组件,如Highcharts、ECharts、JFreeChart等,它们能够...

    修改禁止多次重复提交

    总的来说,防止用户多次重复提交是一个多维度的解决方案,需要前端、后端和数据库共同协作。前端通过禁用按钮防止用户快速点击,后端通过session或token机制确保请求的独特性,数据库则作为最后一道防线,确保数据的...

    struts2 防止表单重复提交的例子

    在Web开发中,表单重复提交是一个常见的问题,它可能导致数据的不一致性或者服务端处理逻辑的混乱。Struts2框架提供了一种解决方案,即使用Token机制来防止表单的重复提交。以下是对这个主题的详细说明: 1. **表单...

Global site tag (gtag.js) - Google Analytics