1、原理:
【1】:<s:token>标签创建一个新的令牌值,并用你所指定的令牌名把令牌保存到session中。而这个令牌值是随即产生的经过加密的字符序列,不会重复。
【2】:<result name="invalid.token">/common/noBack.jsp</</result>指当发现重复提交时,需要流转到的页面.
【3】:为action配置TokenInterceptor或者TokenSessionStoreInterceptor拦截器。这两个拦截器都已经在struts-default.xml中定义,但没有包含在defaultStack拦截器栈中。 <interceptor-ref name="token"/>和<interceptor-ref name="defaultStack"/>是两个拦截器的配置,目的是为了接收页面传入的token令牌及参数,其中<interceptor-ref name="token"/>标示启用TokenInterceptor 如果表单重复提交,会提示The form has already been processed or no token was supplied, please try again。修改国际化文件struts.messages.invalid.token 的键值,提供自己定制的错误信息。比如:struts.messages.invalid.token= 您已经提交了表单,请不要重复提交。
2、具体实现:
表单
<s:form action="register" method="post">
<s:token/>
</s:form>
struts配置文件
<action name="register" class="org.sunxin.struts2.action.RegisterAction"> <result name="input">/pages/register.jsp</result> <!-- 视图invalid.tokenw为不刷新的页面或action,如果是action需要添加type="redirectAction" --> <result name="invalid.token">/pages/register.jsp</result> <interceptor-ref name="token"/> <interceptor-ref name="defaultStack"/> </action>
3、疑问:
拦截器token和tokenSession到底有什么区别,知情者请留言,不胜感激
为什么我同事用tokenSession好用,我的不好用