防止多次提交表单,见表单:
<s:form action="formAction">
<s:bean name="com.test.service.BookService" id="bs"></s:bean>
<s:checkboxlist list="#bs.books" label="请选择喜欢的图书" name="b" listKey="author"
listValue="name" labelposition="top"></s:checkboxlist>
<s:token/>
<s:submit value="提交"/>
</s:form>
加入<s:token/> 还要在<action>中定义拦截器
<action name="formAction" class="com.test.action.FormAction">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="token"/>
<result>success.jsp</result>
<result name="invalid.token">/error.jsp</result>
</action>
但拦截器判断为重复提交,则返回invalid.token,转到error.jsp
理解:
1、JSP使用<s:token/>标签的时候,Struts2会建立一个GUID(全局唯一的字符串)放在session中,并且会成为一个hidden放在form中。
2、token拦截器会判断客户端form提交的token和session中保存的session是否equals。如果equals则执行Action。否则拦截器直接返回invaid.token结果,Action对应的方法也不会执行