struts2的防止重复提交 也使用到了 token (令牌机制),并且使用到了struts2 的一个叫token 的过滤器
使用方法: 看看我们项目的例子
1. 首先在struts的配置文件中 给你的action 加上 token 过滤器
- <!-- 用户 -->
- <action name="user" class=" ">
- <!-- 用户列表 -->
- <result name="userList">/page/user/userlist.jsp</result>
- <!-- 添加用户 -->
- <result name="add">/page/success.jsp</result>
- <!-- 删除用户 -->
- <result name="del">user!queryAll.action</result>
- <!-- 转向修改用户信息 -->
- <result name="toUpdate">/page/user/updateuser.jsp</result>
- <!-- 转向添加用户页面 -->
- <result name="toAdd">/page/user/adduser.jsp</result>
- <!-- 防止重复提交 -->
- <result name="invalid.token">/page/error.jsp?message=重复提交</result>
- <interceptor-ref name="defaultStack"/>
- <interceptor-ref name="token">
- <param name="includeMethods">addUser</param>
- </interceptor-ref>
- </action>
<!-- 用户 --> <action name="user" class=" "> <!-- 用户列表 --> <result name="userList">/page/user/userlist.jsp</result> <!-- 添加用户 --> <result name="add">/page/success.jsp</result> <!-- 删除用户 --> <result name="del">user!queryAll.action</result> <!-- 转向修改用户信息 --> <result name="toUpdate">/page/user/updateuser.jsp</result> <!-- 转向添加用户页面 --> <result name="toAdd">/page/user/adduser.jsp</result> <!-- 防止重复提交 --> <result name="invalid.token">/page/error.jsp?message=重复提交</result> <interceptor-ref name="defaultStack"/> <interceptor-ref name="token"> <param name="includeMethods">addUser</param> </interceptor-ref> </action>
注意:
a.includeMethods 指定 需要拦截的方法 excludeMethods 指定 不需要拦截的方法 ,多个方法使用 逗号分隔
b. 当 拦截器拦截到 当发生重复提交的action 时候 会跳转到 invalid.token 指定的页面
c. 为了使用 统一的错误页面,在错误页面上接受到 message 参数的值 可以在 error.jsp 使用 ${param['message']}
2. 在提交页面的 form 中增加 <s:token/> 标签 ,需要在页面 中加上
<%@ taglib uri="/struts-tags" prefix="s"%>
上面的拦截器是局部的拦截器,只对 UserAction 有效,下面 看看我们项目中的全局拦截器的配置例子:
- <package name="user" extends="struts-default">
- <!-- 用户登录超时过滤器 -->
- <interceptors>
- <!-- 自定义session超时过滤器 -->
- <interceptor name="login" class="cn.com.xinli.ump.webapp.filter.SessionTimeOutFilter"/>
- <!-- 过滤器堆栈 -->
- <interceptor-stack name="myStack">
- <!-- 缺省过滤器 -->
- <interceptor-ref name="defaultStack"/>
- <!-- session超时过滤器 -->
- <interceptor-ref name="login"/>
- <!-- 重复提交过滤器 -->
- <interceptor-ref name="token">
- <param name="includeMethods">addUser</param>
- </interceptor-ref>
- </interceptor-stack>
- </interceptors>
- <!-- 设置默认顾虑器 -->
- <default-interceptor-ref name="myStack"/>