<s:token/>
生成如下的内容:(struts.token.name 标识哪个隐藏域存了 token 值)
<input type="hidden" name="struts.token.name" value="struts.token"/>
<input type="hidden" name="struts.token" value="7GXL55LPSGU19SDC9D3VP54I20XT3BVA"/>
注意自定义的表单域别重名了。它的作用是防止表单重复提交,每次加载页面 struts.token 的值都不一样,如果两次提交时该值一样,则认为是重复提交。此时要启用 TokenInterceptor(token) 拦截器,最好是也启用 TokenSessionStoreInterceptor(token-session) 拦截器,不然后台会出现错误提示:
2008-5-17 22:39:21 com.opensymphony.xwork2.interceptor.ParametersInterceptor setParameters
严重: ParametersInterceptor - [setParameters]: Unexpected Exception catched: Error setting expression 'struts.token' with value '[Ljava.lang.String;@1c2e163'
2008-5-17 22:39:21 com.opensymphony.xwork2.interceptor.ParametersInterceptor setParameters
严重: ParametersInterceptor - [setParameters]: Unexpected Exception catched: Error setting expression 'struts.token.name' with value '[Ljava.lang.String;@abaf8c'
但不影响使用。不过如果只有 token-session 拦截器却是不行的。
token 和 token-session 拦截器的启用,是在 struts.xml 配置文件中,既可以为包启用,也可以单独为某个 action 启用:
1) 为包启用 token 和 token-session
<package name="mgrSystem" namespace="/web" extends="json-default">
<interceptors>
<interceptor-stack name="formDefaultStack">
<interceptor-ref name="token">
<param name="includeMethods">save</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="formDefaultStack"></default-interceptor-ref>
<global-results>
<result name="invalid.token">/web/duplicate.jsp</result>
</global-results>
<action name="*Menu" class="menuAction" method="{1}">
<result>/web/mgrMenuList.jsp</result>
<result name="input">/web/${url}?id=${menu.id}</result>
</action>
</package>
2) 为 Action 启用 token 和 token-session
<action name="*Menu" class="menuAction" method="{1}">
<!--
<interceptor-ref name="token">
<param name="includeMethods">save</param>
</interceptor-ref>
-->
<interceptor-ref name="token">
<param name="includeMethods">save</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="invalid.token">/web/duplicate.jsp</result>
<result>/web/mgrMenuList.jsp</result>
<result name="input">/web/${url}?id=${menu.id}</result>
</action>
注意 token、token-session 和 defaultStack 的顺序要保证,还需要加上名为 "invalid.token" 的 result,当发现重复提交时转向到这个逻辑页,如 /duplicate.jsp,在 /duplicate.jsp 加上 <s:actionerror /> 在出现重复提交时就会提示:The form has already been processed or no token was supplied, please try again.
这样就OK了,但是在页面显示的英文,
The form has already been processed or no token was supplied, please try again.
如何定义成自己想要的呢?这个不难,你找到 struts2-core.jar打开这个文件找到 org.apache.struts2 下里面有一个 struts-message.properties的文件,打开看看里面是否有一个
struts.messages.invalid.token=The form has already been processed or no token was supplied, please try again.
好了,前面的Key就是我们想要的struts.messages.invalid.token 把它复制到你定义的 .properties 文件里,struts.messages.invalid.token = \u5bf9\u4e0d\u8d77\uff0c\u4e0d\u80fd\u91cd\u590d\u63d0\u4ea4