Struts2 防止重复提交 注解配置 xml配置

防重复提交其实很简单,首先我们用普通的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方法前,即可。

你可能感兴趣的:(struts2)