用户重复提交同一个HTML表单的原因不在乎两种:一是操作失误;二是某个表单的处理时间过长而使得用户不知该如何是好。在某些场合,重复提交同一个HTML表单的后果可能非常严重;在另外一些场合,这种情况也许只会令人敢不快而已。例如,在使用使用卡进行在线支付到时候,如果服务器的响应速度太慢,用户难免会再次点击提交按钮,而这就有可能导致那张信用卡上的金额被划走两次。我们再来看一个后果没那么严重的例子 -- 用来录入产品信息的表单,重复提交这些表单可能同一中产品被添加二次。
在防止重复提交同一个表单方面,不同的浏览器有这不同的行为。Mozilla Firefox浏览器对重复点击同一按钮将不予理睬,这为我们提供了某种形式的保护。其他品牌的浏览器,包括IE在内,目前还没有实现能够防止重复提交的功能。此外,Mozilla和非Mozilla浏览器都算上,如果在请求被处理之后按下了浏览器本身的Refresh/Reload(刷新)按钮。同样的请求就会被再次提交,而这显然是一种重复提交行为。因为,质押重复提交有可能给你的业务逻辑带来不良影响,你就必须采取必要的预防措施。
Struts已经内置了能够防止用户重复提交同一个HTML表单的功能。它采用的办法在其他一些用来开发Web应用程序的技术里也可以见到:让服务器生成一个唯一标记,并在服务器和表单里保存一份这个标记的副本。此后,在用户提交表单的时候,表单里的标记将虽说这其他请求参数一起发送到服务器,服务器将对它收到的标记和它留存的标记进行比较。如果两者匹配,这次从提交来的表单就是被认为是有效的,服务器将对之做出必要的处理并重新设置一个标记。随后(因为不小心)提交相同的表单就会失败,因为服务器上的标记已经重置。
1,struts2的防止重复提交,也使用到了token(令牌机制),并且使用到了struts2的一个叫token的拦截器
添加商品页面:
<body>
<s:form action="product_doAddProduct.action" method="post">
<s:token></s:token>
<s:textfield name="name" label="商品名称"></s:textfield>
<s:textfield name="price" label="商品价格"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
</body>
struts.xml 配置文件
<package name="token" extends="struts-default" namespace="/jsp">
<action name="product_*" class="org.cric.action.ProductAction" method="{1}">
<result name="success">/jsp/product.jsp</result>
<result name="invalid.token">/jsp/error.jsp?message=重复提交</result>
<interceptor-ref name="token"/>
<interceptor-ref name="defaultStack"/>
</action>
</package>
动作层:
public String doAddProduct() throws Exception{
System.out.println("添加商品了……");
Thread.sleep(10000);
return "success";
}
错误页面:
<body>
${param['message']}
</body>
显示商品信息页面:
<body>
商品名称:<s:property value="%{name}"/><br>
商品价格:<s:property value="%{price}"/>
</body>
注意:
a:当拦截器拦截到 当发生重复提交的action时候,会跳转到invalid.token指定的页面。
b:为了使用同一的错误页面,在错误页面上接受到message参数的值,可以在error.jsp使用 ${param['message']}
c:在提交页面的form中添加<s:token/>标签,需要在页面中加上。
2,struts2的防止重复提交,也使用到了token(令牌机制),并且使用到了struts2的一个叫token-session的拦截器
Token Session拦截器扩展了Token并提供了一种更复杂的服务。Token Session拦截器不想Token拦截器那样会返回一种特殊的结果并添加一个动作错误,它采用的做法只是阻断后续的提交,而这么做的后果是用户将看到同一的响应,就好像只有一次提交那样!
<package name="token" extends="struts-default" namespace="/jsp">
<action name="product_*" class="org.cric.action.ProductAction" method="{1}">
<result name="success">/jsp/product.jsp</result>
<interceptor-ref name="token-session">
<param name="includeMethods">doAddProduct</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
</action>
</package>
注意:
a:includeMethods 指定需要拦截的方法 excludeMethods 指定不需要拦截的方法,多个方法使用逗号分隔
b:把第一个程序的配置文件换成这个,不需要错误页面。
分享到:
相关推荐
Spring Boot 防止重复提交实现方法详解 Spring Boot 防止重复提交是指在用户提交表单或请求时,防止同一客户端在短时间内对同一 URL 的重复提交,从而避免服务器端的处理压力和数据的一致性问题。下面将详细介绍 ...
防止重复提交对于确保数据的准确性和应用的稳定性至关重要。本文将深入探讨如何在ASP.NET环境中解决这个问题。 首先,理解问题的本质:当用户点击提交按钮两次或者由于网络延迟,浏览器可能会发送两次请求到服务器...
以下是如何在使用Element-UI时防止重复提交的具体方法: 1. 对话框(Dialog)内的表单提交: 错误方案常常是在最后的回调函数中同时隐藏Dialog和恢复提交按钮的可点击性。问题在于Dialog的隐藏是一个动画过程,这...
在Struts2中,防止重复提交是一个重要的问题,因为它可能导致数据不一致性和服务器资源的浪费。本文将详细介绍如何在Struts2中解决这个问题,以及相关的技术概念。 首先,我们要理解Struts2中的拦截器(Interceptor...
本文将深入探讨自定义标签在防止重复提交中的实现原理和应用。 首先,我们要理解什么是自定义标签(Custom Tags)。在JavaServer Pages(JSP)中,自定义标签是扩展JSP功能的一种方式,它可以封装复杂的业务逻辑...
提交表单后提交禁用提交按钮,防止重复提交.
在Spring MVC框架中,防止重复提交是一个重要的议题,特别是在处理敏感数据或执行不可逆操作时。重复提交可能会导致数据不一致性和系统混乱。"Token-SpringMVC"是一种常见的解决方案,它利用令牌(Token)机制来确保...
拦截器防止重复提交的设置步骤 在 Struts2 框架中,防止重复提交是一个非常重要的安全性问题。重复提交可能会导致数据的不一致和系统的不稳定。为了解决这个问题,Struts2 提供了拦截器机制来防止重复提交。在本文...
在Spring框架中,防止重复提交是一项重要的功能,它有助于确保数据的一致性和完整性。重复提交可能会导致数据库中的数据不一致,特别是在并发环境下。本篇将详细介绍如何在Spring中实现这一功能,主要分为四个步骤:...
#### 核心知识点:防止重复提交机制 在Web应用开发中,防止用户重复提交表单是一项重要的功能,尤其在涉及到交易、支付等敏感操作时更为关键。重复提交不仅可能导致数据错误,还可能增加服务器负担,甚至引发安全...
在IT行业中,尤其是在Web开发领域,防止重复提交是一项至关重要的任务。Truts2作为一款流行的Java Web框架,提供了多种机制来防止用户意外或恶意地多次提交表单数据,从而保护系统的稳定性和数据的一致性。这里我们...
作用是禁用提交按钮,防止表单重复提交 1、禁用/启用按钮 $("#btnSub").subLoading({enabled:false}) $("#btnSub").subLoading({enabled:true}) 2、禁用后定时启用 $("#btnSub").subLoading({enabled:false,timeout:...
在Struts的配置文件(例如`struts.xml`)中,为需要防止重复提交的Action添加一个拦截器栈,包括`token`和`tokenSession`拦截器。 ```xml <!-- 配置错误结果页面 --> <param name="includeParams">none ...
登录防止重复提交是网络安全中一个重要的实践,主要目的是保护用户数据的安全性和系统资源的有效利用。在Web应用中,用户登录时可能会因为网络延迟或其他原因导致多次点击提交按钮,从而产生重复登录请求,这可能...
- 使用HTTP-only cookies:存储一个提交标志,当表单提交后设置此标志,后续请求检查该标志以防止重复提交。 - **结合服务器端和客户端验证**:为了增加安全性,通常建议同时在服务器端和客户端进行验证。客户端...
在IT行业中,尤其是在分布式系统和高并发场景下,防止重复提交是确保数据一致性的重要策略。本项目"java+redis+lua实现重复提交操作拦截"旨在解决这个问题,通过结合Java、Redis和Lua技术来构建一个高效的解决方案。...
### Struts2防止重复提交的解决方案 #### 一、引言 在Web应用程序开发中,一个常见的问题是如何有效地防止表单的重复提交。这不仅能够提高用户体验,还能增强系统的安全性。Struts2作为一款广泛使用的Java Web应用...
在Web开发中,防止重复提交是一项重要的任务,因为它可能导致数据的不一致性或处理逻辑的错误执行。Struts2提供了几种策略来防止表单的重复提交,确保请求的唯一性和事务的一致性。 一、令牌(Token)机制 Struts2...