防重复提交其实很简单,首先我们用普通的XML配置来理解一下:
1) 只要在jsp里面必须加上一个token标签
<s:token name="token"></s:token>
加完之后你可以浏览器里查看源代码,看看这个标签生成什么样的HTML标签了。不出意外,应该有类似如下两句:
<input type="hidden" name="struts.token.name" value="token" />
<input type="hidden" name="token" value="I3Q3IKH98IFQ5E8L48MP9WI9BGRK2GT7" />
是两个表单都是隐藏表单,里面有一个36位的加密的值,这也是struts2自动生成的,而且它把这个值存到了session里,当第一次提交表单时它会进行比较,如果一样的可以提交反之不许提交,这是struts2的拦截器做的。
2)加上这个还不行,因为struts2用的是拦截器进行执行的,可以到struts-default.xml里看看这个拦截器是不是被加入了struts-default里面,显而没有加入,这得自己进行配置了,在 struts.xml 给自己的action 里加入一个拦截器
<action name="t" class="com.tx.action.TAction" method="test">
<result>/success.jsp</result>
<result name="input">/index.jsp</result>
<result name="invalid.token">/index.jsp</result>
<interceptor-ref name="token"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
如果你在action里加上了自己的拦截器那么默认的拦截器不起作用了,你得自己手动再加入,否则好多功能不能用了。
一定要把 <s:token name="token"></s:token> 放在表单里面 form 里面,否则报一个
警告: Could not find token name in params.
理解了上面后,来看看注解配置:
@Action(value="userTrans",
interceptorRefs = {
@InterceptorRef("token"),
@InterceptorRef("defaultStack")
},
results={
@Result(name="invalid.token", type = "redirect", location = "/accessLogin.action"),
@Result(name="success", location="/page/account/trans/transfer_submit.jsp"),
@Result(name="failuer", type = "redirect", location = "/accessLogin.action")
}
)
将此配置放置在对应的action方法前,即可。