struts2 防止重复提交 实例代码
2013-01-16 13:38
351 查看
首先说说重复提交是怎么产生的,一般情况下有两种方式:
1,页面提交后再次刷新页面。
2,在提交的时候多次点击提交按钮。
strut1.x中解决防止提交1的方法是通过重定向解决,但是方式2在网速很慢或者是用户快速的点击提交按钮时,还是能够重复提交数据。
struts2中为方式2提供了解决方案(方式1用重定向是也可以防止用户刷新页面而引起的重复提交),struts2通过使用令牌(token)解决此类的问题。
要使用token,首先在页面上在你要提交的表单中加上<s:token/>,次标签解析后会生成两个隐藏域:
在该标签执行完成后会生成一个随机的值(红色部分),该值同时会加入到session中。
其次,就是在你个struts.xml中加入token拦截器。
如果是用注解的话,那么的action要这么定义:@ParentPackage("token-struts")。
如果不是注解,可以将上面的拦截器栈加入到你的actin定义中。
这样就完成了整个防止重复提交的任务了。
如果你想了解此拦截器是这么工作的,你可以打开源码看看,其中TokenHelper.validToken()最是关键,就是通过这个帮助类完成对令牌的判断。
上述是可以解决重复提交的问题,但是随之而来的又是一个麻烦。
拦截器顾名思义就是用来对请求进行拦截的,一个请求在执行前就被拦截了,默认情况下拦截器会拦截被配置下所有的请求。但是很多情况下该配置下的其他请求不需要这个拦截,比如删除,更新操作。就完成不需要这个拦截器去拦截。拦截器又不能区分不同的请求而做出不同的操作。
这种情况就有两种解决方案:
第一,不用token拦截器,只在你需要防止重复提交的action处理方法中加入 TokenHelper.validToken()这个判断,如果为返回true就执行,否则跳过。
第二,用token拦截器,但是重写此拦截器TokenInterceptor。在重写的拦截器中判断tokenNames,如果值为空则不做任何操作,如果有值则做拦截。
1、使用Struts2的表单标签,其中需要增加token标签。index.jsp表单页面
2.PersonAction类
3.struts.xml配置文件
4.message.jsp返回成功页面
5.error.jsp表单重复提交提示页面
1,页面提交后再次刷新页面。
2,在提交的时候多次点击提交按钮。
strut1.x中解决防止提交1的方法是通过重定向解决,但是方式2在网速很慢或者是用户快速的点击提交按钮时,还是能够重复提交数据。
struts2中为方式2提供了解决方案(方式1用重定向是也可以防止用户刷新页面而引起的重复提交),struts2通过使用令牌(token)解决此类的问题。
要使用token,首先在页面上在你要提交的表单中加上<s:token/>,次标签解析后会生成两个隐藏域:
<input type ="hidden" name ="struts.token.name" value ="struts.token" /> <input type ="hidden" name ="struts.token" value ="LVYMI4CX9YBDS9A0AAF9UAJL8UDX1N05 " />
在该标签执行完成后会生成一个随机的值(红色部分),该值同时会加入到session中。
其次,就是在你个struts.xml中加入token拦截器。
<package name="token-struts" extends="struts-default"> <interceptors> <interceptor name="token"/> <interceptor-stack name="token-default"> <interceptor-ref name=" token "/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <default-interceptor-ref name="token-default"/> </package>
如果是用注解的话,那么的action要这么定义:@ParentPackage("token-struts")。
如果不是注解,可以将上面的拦截器栈加入到你的actin定义中。
这样就完成了整个防止重复提交的任务了。
如果你想了解此拦截器是这么工作的,你可以打开源码看看,其中TokenHelper.validToken()最是关键,就是通过这个帮助类完成对令牌的判断。
上述是可以解决重复提交的问题,但是随之而来的又是一个麻烦。
拦截器顾名思义就是用来对请求进行拦截的,一个请求在执行前就被拦截了,默认情况下拦截器会拦截被配置下所有的请求。但是很多情况下该配置下的其他请求不需要这个拦截,比如删除,更新操作。就完成不需要这个拦截器去拦截。拦截器又不能区分不同的请求而做出不同的操作。
这种情况就有两种解决方案:
第一,不用token拦截器,只在你需要防止重复提交的action处理方法中加入 TokenHelper.validToken()这个判断,如果为返回true就执行,否则跳过。
第二,用token拦截器,但是重写此拦截器TokenInterceptor。在重写的拦截器中判断tokenNames,如果值为空则不做任何操作,如果有值则做拦截。
1、使用Struts2的表单标签,其中需要增加token标签。index.jsp表单页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>防止表单重复提交</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <!-- 防止表单重复提交,记得在form表单里填上<s:token></s:token> --> <!-- action="token"、action="tokenSession" --> <s:form action="token.action" namespace="/test" method="post"> 姓名:<s:textfield name="name"/><s:token></s:token> <input type="submit" value="发送"/> </s:form> </body> </html>
2.PersonAction类
package com.ljq.action; import java.util.ArrayList; import java.util.List; public class PersonAction { private String name; @SuppressWarnings("unchecked") //观看控制台 //如果token生效则不会在控制台输出name的值,而会输出如下警告: 2011-3-14 20:45:32 com.opensymphony.xwork2.util.logging.commons.CommonsLogger //warn 警告: Form token EDZ4S96RNDN5VD8B1CQTK6FTHIJUPC66 does not match the session token null. public String execute() { List ls = new ArrayList(); ls.add(name); for (int i = 0; i < ls.size(); i++) { System.out.println(ls.get(i)); } return "success"; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
3.struts.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- 默认的视图主题 --> <constant name="struts.ui.theme" value="simple" /> <!-- struts2在防止表单重复提交的拦截中有2个,分别是:token,tokenSession。tokenSession继承token而来。 通常情况下,使用tokenSession客户端感觉会比较友好。 --> <!-- 如果重复提交,会跳转到error.jsp页面 --> <package name="person" namespace="/test" extends="struts-default"> <action name="token" class="com.ljq.action.PersonAction"> <interceptor-ref name="defaultStack" /> <interceptor-ref name="token" /> <!-- 如果重复提交,跳转到error.jsp页面 --> <result name="invalid.token">/WEB-INF/page/error.jsp</result> <result name="success">/WEB-INF/page/message.jsp</result> </action> <action name="tokenSession" class="com.ljq.action.PersonAction"> <interceptor-ref name="defaultStack" /> <interceptor-ref name="tokenSession" /> <!-- 如果重复提交,不会跳转到error.jsp页面 --> <result name="invalid.token">/WEB-INF/page/error.jsp</result> <result name="success">/WEB-INF/page/message.jsp</result> </action> </package> </struts>
4.message.jsp返回成功页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <s:property value="name"/><br/> <%=new Date() %> </body> </html>
5.error.jsp表单重复提交提示页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'error.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> 您已经提交了表单,请不要重复提交。 </body> </html>
相关文章推荐
- struts2 防止重复提交 实例代码
- 【struts2防止重复提交实例代码】
- ASP技巧实例:几行代码解决防止表单重复提交
- struts2利用token和tokenSession实现防止表单重复提交的具体代码
- struts2防止页面重复提交的解决方案
- Struts2防止重复提交
- 防止刷新/后退引起的重复提交问题的Java Token代码,非Struts
- Struts2第十三篇【防止表单重复提交】
- Struts2 拦截器、防止重复提交
- 【struts2】struts防止表单重复提交源码分析
- 防止刷新/后退引起的重复提交问题的Java Token代码
- 1111struts2防止表单重复提交
- 几行代码防止表单重复提交
- Struts2中防止表单重复提交的两种方式
- 使用struts2的token机制和cookie来防止表单重复提交
- struts2防止表单重复提交的解决方案
- struts2 token 防止重复提交原理
- struts2防止表单重复提交的解决方案
- Struts2----><s:token />标签防止重复提交
- Session Token机制-Struts2中防止表单重复提交的两种方式(一)