首先,如果你打算使用strut2处理表单重复提交的功能,那么你一定要在你的表单中加上<s:token></s:token>,无论你使用的是html的form标签,还是<s:form></s:form>.
先说一下原理,我们都知道session有一个sessionId字符串作为这个session的身份标识,服务器根据这个sessionId来判断是否是同一个session,类似的struts利用<s:token>产生一个唯一的字符串,作为表单的身份标志,同时在服务器端备份了此字符串标志,当表单提交之后,服务器比较两个字符串是否相同,相同则执行action,同时把服务器这边的字符串重置为新的字符串,从而当同一个表单第二次提交时,由于身份标志不同导致不能重复提交,想了解的更多可以参考http://www.cnblogs.com/iyangyuan/archive/2013/05/05/3060488.html
原理讲完了谈下具体的步骤
1.使用<s:token></s:token>标签
2.使用token或者tokenSession
1 <package name="testtoken" namespace="/" extends="struts-default"> 2 <!-- 使用token --> 3 <action name="token_*" class="com.itcast.c_token.TestToken" method="{1}"> 4 <result name="success">/index.jsp</result> 5 <!-- 使用tokenSession无需指定invalid.token --> 6 <result name="invalid.token">/message.jsp</result> 7 8 <!-- 重定向处理重复提交:这样在index页面刷新不会重复提交但退回到login页面仍然可以重复提交 --> 9 <!-- <result name="success" type="redirect">/index.jsp</result> --> 10 11 <interceptor-ref name="defaultStack"></interceptor-ref> 12 <!-- 解决了问题,但是是在用户提交之后才进行提示 --> 13 <interceptor-ref name="token"></interceptor-ref> 14 </action> 15 16 17 <!-- 使用tokenSession的方式 --> 18 <action name="token2_*" class="com.itcast.c_token.TestToken" method="{1}"> 19 <result name="success">/index.jsp</result> 20 21 <interceptor-ref name="defaultStack"></interceptor-ref> 22 <!-- 用户可以多次重复提交,但是只处理一次 --> 23 <interceptor-ref name="tokenSession"> 24 <!-- <param name="includeMethods">xx</param> 拦截哪些方法--> 25 </interceptor-ref> 26 </action> 27 </package>
注意事项:
1.不要忘记加上默认的拦截器,因为这两个拦截器并不在缺省的拦截器中
2.使用tokenSession的方式时,不需要指定invalid.token的页面,因为tokenSession和token的不同在于前者无论用户提交多少次,只会处理一次,响应的是提交后的页面,而后者重复提交多次会产生一个name为invalid.token的result,显示一个错误页面,可以通过配置result进行解决
3.使用时要注意拦截哪些方法,否则极有可能导致一些正常的跳转行为出现问题