struts2 自定义拦截器防止重复提交(三、struts.xml中配置及页面书写)
在struts配置文件中对应的包下定义拦截器,注意顺序,
package里元素必须按照一定的顺序排列。这个顺序
就是
result-types
interceptors
default-interceptor-ref
default-action-ref
default-class-ref
global-results
global-exception-mappings
action*(就是所有的action放到最后)
<action>配置中加上名为” invalidToken”的result,就是拦截器中,重复提交跳转的路径
如:
<package?name="template"?extends="struts-default"?namespace="/">
???????<interceptors>
???????????<interceptor?name="invocationToken"?class="com.tydic.ppm.util.TokenAtionInterceptor"></interceptor>
???????</interceptors>
???????<global-results>
???????????<result?name="error">/error.jsp</result>
???????????<result?name="openError">/openError.jsp</result>
???????</global-results>
???????<action?name="addTemplate"?class="templateConfigAction">
???????????<interceptor-ref?name="defaultStack"></interceptor-ref>
???????????<interceptor-ref?name="invocationToken"></interceptor-ref>
???????????<result?name="input">
??????????????/content/templateManage/configTemplate/templateBaseInfo.jsp
???????????</result>
???????????<result?name="success">
??????????????/content/templateManage/configTemplate/templateBaseInfo.jsp
???????????</result>
???????????<result?name="invalidToken">
??????????????/content/templateManage/configTemplate/templateBaseInfo.jsp
???????????</result>
???????</action>
</package>
?
最后在页面上加一个隐藏域,用来保存页面令牌的,如:
<input type="hidden" name="token" value="${token }"/><!--?防止重复提交所用 -->
?
经过上面的步骤就可以实现防止重复提交了。
但是经过我的实践,我在注册的时候用的是后台校验,当你点击提交按钮的时候,会发送请求校验,校验全部通过,这时候的令牌是相同的则会注册成功,如果校验没有通过,将错误的信息改正过来再次提交的时候就这时页面上的令牌和内存中的就不一样了,则会认为是重复提交,也就是不会执行注册的功能,这个问题还有待解决,如果用的是js验证就不会存在这个问题啦,所以还是用js验证+后台校验结合比较好