防止表单重复提交,或者是防止按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表单重复提交的避免方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
防止重复提交java解决 B/S结构的软件开发中,特别是在越大型的分布式应用中体现的越明显,后端的处理往往会因为出现较多的时间消耗而引起延迟,这种延迟有可能过长而终使用户认为是自己的操作错误,导致他们重新...
自定义封装注解类,(生成token存放到redis中)通过注解的方式解决API接口幂等设计防止表单重复提交
主要介绍了浅谈利用Session防止表单重复提交,简单介绍表单重复提交的情况,分析,以及解决方法代码示例,具有一定借鉴价值,需要的朋友可以了解下。
【原创】Struts2防止表单重复提交.doc
主要介绍了JAVA防止重复提交Web表单的方法,涉及Java针对表单的相关处理技巧,具有一定参考借鉴价值,需要的朋友可以参考下
这个示例简单易懂,就是利用token过滤器
最近项目在做一个登录页的时候,为了避免用户的多次重复点击登录按钮发送请求,所以我在点击了按钮发送请求后,将设置按钮变灰并禁用,倒计时一段时间后又可重复点击,具体实现如下,有需要的小伙伴可以参考一下。
主要介绍了Java后台防止客户端重复请求、提交表单实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
本文实例讲述了JSP使用自定义标签防止表单重复提交的方法。分享给大家供大家参考。具体如下: 1. 编写servelt: package cn.itcast.apsliyuan.web.servlet; import java.io.IOException; import javax.servlet....
Java-Base64算法_创新_防止表单重复提交 JAVA企业级基础课题(HashMap那些事) 企业架构师必备技能(JAVA核心技术反射) JavaWeb之基础(手写实现Tomcat服务器) java多线程编程 纯手写实现SpringIOC实现过程 JEE企业级...
7、处理幂等性的思路与防止表单重复提交 8、数据权限 9、分布式事务解决方案(Seata) 10、分布式事务总结 11、自定义注解+AOP 12、权限中的概念梳理 13、登录.授权流程梳理 14、RuoYi-Vue3 15、动态菜单加载思路 16...
Struts2 Struts2核心控制流程、Ognl、Action、Interceptor、Result、FreeMarker、Struts2标记库、Struts2扩展、Struts2应用技巧(输入验证、消息国际化、文件上传和下载、防止重复提交等)。 熟练掌握Struts2核心...
令牌机制防止表单重复提交。 注册表单的JS验证、Ajax用户名唯一性验证等等。 开发环境: jdk1.8+Tomcat 9+Mysql 5.7+Eclipse(本人用Oracle也做了一版,上传的程序是用的Mysql版) 项目功能模块: 用户注册、登录、...
本课程讲解Struts2的执行流程和基本原理分析?本课程全面讲解Struts2的数据封装方式和值栈数据的存储和获取?本课程讲解Struts2防止表单重复提交和注解方式的开发
这里可以实现点击提交按钮后显示loading,防止用户重复提交 <style> #loading { position:absolute; width:500px; height:50px; top:50%; left:50%; margin: -25px -150px; background-color:#FFFFFF;...