防止表单重复提交,或者是防止按F5 刷新提交表单。
在WEB开发中是经常会碰到这样的问题的。
目前主流的解决方法有以下三种:
1、采用脚本来解决
2、重定向到别的页面
3、使用s:token 标签
由于我是使用S2SH来开发的,所以就选择了第三种方法。
先简单的解释下<s:token /> 这个标签,<s:token>就是为了防止Struts2中表单重复提交的。他的实现类是org.apache.struts2.views.jsp.ui.TokenTag,继承于org.apache.struts2.views.jsp.ComponentTagSupport。
TokenTag ComponentTagSupport.doStartTag 将控件对象化
TokenTag ComponentTagSupport.doEndTag component.end 调用component(Token)
Token 继承自org.apache.struts2.components.UIBean,因此首先调用UIBean.end方法,在UIBean.end方法中最后一句调用定义为protected的方法evaluateExtraParams,这个方法是提供给UIBean的子类扩展使用的,在Token的evaluateExtraParams方法中
String token = buildToken(tokenName);
其中buildToken方法实际上调用的是 TokenHelper.setToken方法,在setToken方法中值得注意的是两点,
1、 generateGUID()方法,此方法是生成Token值得算法所在
2 、session.put(tokenName, token)可以看到此处将生成的值存储在session中,等待以后比对。
生成guid后,token拦截器会判断客户端form提交的token和session中保存的session是否equals。如果equals则执行Action。否则拦截器直接返回invaid.token结果,Action对应的方法也不会执行
所以我解决的方法是:
1、前台jsp 表单在提交(</form>)之前,加入<s:token />标签,action中不需要做修改。
2、在配置文件中做如下的配置就可以了
-
<actionname="generateChoose"class="com.fzdna.application.agent.actions.admin.manager.numberManager.ChooseNumberAction"
-
method="generateChoose">
-
<interceptor-refname="defaultStack"/>
-
<interceptor-refname="token"/>
-
<resultname="success">/admin/manager/numberManager/generateChooseNumber.jsp</result>
-
<resultname="error">/admin/manager/numberManager/generateChooseNumber.jsp</result>
-
<resultname="invalid.token"type="redirect">generateChooseNumber.do</result>
-
</action>
这样就可以防止表单重复提交。
再简单说下采用脚本控制,这中方式本来就存在缺陷,如果客服端禁止使用脚本,即使你的脚本写的再好,也是白费。个人建议还是在服务器端进行控制。
前台jsp页面:
<form action="duplicateAction.do" method="post" onsubmit="return checkSubmit();"></form>
js 代码如下:
-
<mce:scriptlanguage="javascript"><!--
-
-
varcheckSubmitFlag=false;
-
functioncheckSubmit(){
-
if(checkSubmitFlag==true){
-
returnfalse;
-
}
-
checkSubmitFlag=true;
-
returntrue;
-
}
-
document.ondblclick=functiondocondblclick(){
-
window.event.returnValue=false;
-
}
-
document.onclick=functiondoconclick(){
-
if(checkSubmitFlag){
-
window.event.returnValue=false;
-
}
-
}
-
至于跳到中转页面,也就是在表单提交的时候跳转到一个中转的jsp页面即可。
借助于网上达人的意见,及个人的体会,简单总结下。
分享到:
相关推荐
服务器端避免表单的重复提交,利用同步令牌来解决重复提交的基本原理如下:(1)用户访问提交数据的页面,服务器端在这次会话中,创建一个session对象,并产生一个令牌值,将这个令牌值作为隐藏输入域的值,随表单一起发送到...
提交表单后提交禁用提交按钮,防止重复提交.
在Java Web开发中,防止重复提交是一个重要的议题,尤其是在大型分布式应用中,因为这可能导致服务器资源的过度消耗,甚至引发系统性能问题。以下是一些防止重复提交的常见策略和技术: 1. **令牌(Token)机制**:...
Java表单重复提交是Web开发中常见的问题,可能导致数据不一致和系统异常。要理解这个问题,首先要明白表单提交的基本流程:用户打开表单页面,填写信息,然后点击提交按钮,浏览器向服务器发送请求,服务器处理请求...
Spring Boot 防止重复提交是指在用户提交表单或请求时,防止同一客户端在短时间内对同一 URL 的重复提交,从而避免服务器端的处理压力和数据的一致性问题。下面将详细介绍 Spring Boot 防止重复提交实现方法的相关...
浅谈利用Session防止表单重复提交 Session是Web应用程序中的一种机制,用于存储用户的会话信息。在Web应用程序中,表单重复提交是一个常见的问题,可能会导致数据库中产生冗余数据,浪费数据库资源。利用Session...
为了解决这一问题,我们可以采用自定义注解结合Redis来实现一个防止表单重复提交的解决方案。 首先,让我们理解自定义注解的核心思想。注解是一种元数据,它提供了在代码中添加信息的方式,这些信息可以被编译器或...
在Web开发中,表单重复提交是一个常见的问题,可能导致数据不一致或服务器资源浪费。本文将深入探讨如何通过自定义标签来防止表单的重复提交,以确保数据的一致性和系统的稳定性。 首先,理解表单重复提交的问题。...
在Web开发中,表单重复提交是一个常见的问题,它可能导致数据的不一致性或者服务端处理逻辑的混乱。Struts2框架提供了一种解决方案,即使用Token机制来防止表单的重复提交。以下是对这个主题的详细说明: 1. **表单...
二、防止表单重复提交的方法 1. **使用JavaScript禁用提交按钮** 在表单提交时,可以使用JavaScript来禁用提交按钮,以防止用户连续点击。例如: ```javascript function disableSubmit() { document....
下面将详细解释Struts2如何通过重定向来防止表单重复提交。 首先,理解表单重复提交的场景:用户在提交表单后,由于网络延迟或其他原因,可能会无意中多次点击提交按钮。如果服务器没有处理这些重复请求,那么相同...
使用Redis和Spring Boot来防止表单重复提交的基本思路是:在接收到表单提交请求后,生成一个唯一的请求标识(例如,基于UUID),并将其作为键存储到Redis中,设置一个适当的过期时间。当服务器接收到新的请求时,会...
综上所述,理解并掌握Struts框架中的数据回显、模型驱动以及防止表单重复提交的原理和实现方法,对于提升Java Web应用的开发效率和质量具有重要意义。在实际开发中,应灵活运用这些技术,以满足项目需求,打造稳定...
表单重复提交是指在一次请求完成之前防止重复提交,解决表单重复提交有多种形式,以下以 Aop+自定义注解+Redis 为例来介绍。 解决方案的详细流程 1. 当页面加载时,前端请求后台,后台生成 token 缓存到 Redis ...
在这个SSH笔记中,我们将深入探讨四个核心主题:数据验证、文件上传下载、防止表单重复提交以及自定义拦截器。 首先,我们来谈谈数据验证。在Web应用中,数据验证是必不可少的一环,它确保用户输入的数据符合业务...
在Struts2中防止表单重复提交的过程主要包括以下几个步骤: 1. **生成Token**:当用户发起表单请求时,服务器会生成一个唯一的Token并将其存储在服务器的会话(Session)中,同时将这个Token作为隐藏字段放入到HTML...
在Web开发中,防止表单重复提交是一个常见的需求,尤其是在处理敏感数据或者执行不可逆操作时。Struts2为解决这个问题引入了Token机制,确保每个表单提交只被处理一次,避免了由于用户意外刷新页面导致的重复请求。 ...
防止页面刷新重复提交是 Web 开发中常见的问题,多次提交表单可能会导致不必要的数据重复录入、服务器压力增大等问题。下面我们将详细介绍防止页面刷新重复提交的方法。 一、验证码方法 验证码方法是防止页面刷新...
Struts2作为一个流行的Java Web框架,为解决表单重复提交提供了多种方法。 首先,关于表单重复提交的原因,有以下几点: 1. 服务器或网络延迟导致用户多次点击提交按钮。 2. 用户在表单提交后刷新浏览器页面。 ...