struts2利用token机制拦截用户重复提交

一、引起重复提交的原因


 

1. 服务器处理慢,用户手动再次点击了提交相关的按钮

2. 提交成功后,用户因为某些原因进行刷新操作

二、防止重复提交的方法


 

1. 表单提交方法应该设置为method="post" 这样用户刷新时,浏览器会提示用户是否再次提交(method="get"则不会)

2. 在表单数据提交后,程序处理应该使用重定向页面,这样刷新也重复提交不了数据了

3. 使用struts2的token机制来拦截重复提交

  (1) 页面form表单内增加代码:<s:token></s:token><s:token/>
  (2) 在struts.xml配置文件的<package>中配置拦截器

拦截器配置
 1 <interceptors>
 2     <!-- 声明需要的拦截器,可声明多个 -->
 3     <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
 4     <interceptor name="..." class="..."/>
 5 
 6     <!-- 自定义拦截器配置 -->
 7     <interceptor-stack name="myStack">
 8         <!-- 将声明的拦截器加入队列,可加入多个 -->
 9         <interceptor-ref name="alias" />
10         <interceptor-ref name="..."/>
11         <!--必需引用这个,否则点下一个子ACTION会报错-->
12         <interceptor-ref name="defaultStack" />
13     </interceptor-stack>
14 </interceptors>

  (3) 在struts.xml配置文件的<action>中加入拦截器并配置异常处理页面(这是配置给某一个action)

拦截器加入action
1 <!-- 配制拦截后跳转的页面 -->  
2 <result name="invalid.token">/invalidToken.jsp</result>  
3 <result name="exception">/error.jsp</result>
4 
5 <!-- 配制定义的拦截器 -->
6 <interceptor-ref name ="myStack"/>
7 
8 <!-- 配制异常信息处理,指Action抛出Exception异常时,转入名为exception的结果页面 -->
9 <exception-mapping result="exception" exception="Exception" />

  

  或可以配置全局action的拦截器,在struts.xml配置文件的<package>中加入全局配置

全局配置拦截器
 1 <!-- 配置默认的拦截器 -->
 2 <default-interceptor-ref name="myStack"/>
 3 
 4 <global-results>
 5     <!-- 下面定义的结果对所有的Action都有效 -->
 6     <result name="exception">/error.jsp</result>
 7     <result name="invalid.token">/invalidToken.jsp</result>
 8 </global-results>
 9 
10 <global-exception-mappings>
11     <!-- 指Action抛出Exception异常时,转入名为exception的结果。 -->
12     <exception-mapping exception="java.lang.Exception" result="exception" />
13 </global-exception-mappings>
★不是每一次努力都会有收获,但是每一次收获都必须努力,这是一个不公平的不可逆转的命题★
原文地址:https://www.cnblogs.com/lishaofei/p/2938877.html