Struts2拦截器

455 查看

1.拦截器简介

默认的拦截器在设计的时候就能满足大部分的应用,所以很多时候就不需要添加自定义的拦截器或者修改拦截器栈。很多action有各种各样的需求,比如输入验证、文件上传、防止多次提交等等。于是struts框架就提供了一个解决方案,Interceptor策略。当你请求一个action时,在执行当前action之前,会执行拦截,执行完action之后会再次进行拦截。这个过程通称为拦截器

由于拦截器在action执行前后都会被执行,所以struts2的框架的核心功能大部分都作为拦截器进行实现,比如类型转换、数据验证等等,并且这些功能都是可插拔的,所以在使用时可以决定action使用哪些功能。自定义的拦截器可以和框架内置的拦截器进行混合使用,一般情况拦截器都被默认配置成为action执行的基础。若类型转换失败,或者数据验证失败,拦截器就会阻止action的执行。

2.拦截器配置

在大部分应用中,如果会多次使用同一系列的拦截器,可以将这些拦截器进行整理,聚合成Interceptor Stack

<package name="default" extends="struts-default">
   <interceptors>
        <interceptor name="timer" class=".."/>
        <interceptor name="logger" class=".."/>
        <interceptor-stack name="myStack">
           <interceptor-ref name="timer"/>
           <interceptor-ref name="logger"/>
        </interceptor-stack>
    </interceptors>
 
<action name="login"
     class="tutuorial.Login">
         <interceptor-ref name="myStack"/>
         <result name="input">login.jsp</result>
         <result name="success"
             type="redirectAction">/secure/home</result>
</action>
</package>

struts2框架默认的拦截器在struts2-core-2.3.24.1.jar包中的struts-default.xml中。

Interceptor Name Description
Alias Interceptor alias 允许参数在跨越多个请求时使用不同别名,这个拦截器可将多个action使用不同名字链接起来,然后用于处理同一信息
Chaining Interceptor chain 允许当前action能够使用上一个被执行action的属性,这个拦截器通常要和“chain”结果类型一起使用(<result type=”chain”…/>)
Checkbox Interceptor checkbox 为没有被选定的多选框增加一个值为false的参数,协助管理多选框(在HTTP请求里,那些没有被选定的多选框通常是没有任何信息的
Cookie Interceptor cookie 使用配置的name,value来指定cookies
CookieProvider Interceptor cookieProvider 将cookies从action传输到response
Conversion Error Interceptor conversionError 将转换错误的信息(包括转换的字符串和参数类型等)存放到action的字段错误集里去
Create Session Interceptor createSession 自动创建一个HttpSession会话(如果会话不存在),用来为需要使用到HttpSession的拦截器服务
DebuggingInterceptor debugging 当使用Struts2的开发模式时,此拦截器会提供更多的调试信息,为开发者提供几种不同调试界面
DeprecationInterceptor deprecation 当devMode设置为on,会将所有未知或过时的设置打上log
Execute and Wait Interceptor execAndWait 当action在后台执行时,给用户显示一个过渡性的等待页面
Exception Interceptor exception 将action抛出的异常映射到结果,这样就通过重定向来自动处理异常,一般情况下,应该为最后一个拦截器
File Upload Interceptor fileUpload 此拦截器主要用于文件上传,它负责解析表单中文件域的内容
I18n Interceptor i18n 这是支持国际化的拦截器,它负责把所选的语言、区域放入用户Session中
Logger Interceptor logger 通过输出被执行action的名字,提供简单的日志功能,记录用于追踪的信息(可位于拦截器序列的不同位置)
Message Store Interceptor store 在会话中为action存储和检索消息、字段错误以及action错误,该拦截器要求action实现ValidationAware接口
Model Driven Interceptor modelDriven 这是一个用于模型驱动的拦截器,当某个Action类实现了ModelDriven接口时,它负责把getModel()方法的结果放入ValueStack中
Scoped Model Driven Interceptor scopedModelDriven 如果一个Action实现了一个ScopedModelDriven接口,该拦截器负责从指定生存范围中找出指定的Modol,并将通过setModel方法将该Model传给Action实例
Parameters Interceptor params 这是最基本的一个拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值
Prepare Interceptor prepare 如果action实现Preparable接口,将会调用该拦截器的prepare()方法
Scope Interceptor scope 这是范围转换拦截器,它可以将Action状态信息保存到HttpSession范围,或者保存到ServletContext范围内。
Servlet Config Interceptor servletConfig 如果某个Action需要直接访问ServletAPI,就是通过这个拦截器实现,它提供访问HttpServletRequest和HttpServletResponse的方法,以map的方式访问
Static Parameters Interceptor staticParams 设置action里的静态定义值(通过action配置里的param标签来实现);这个拦截器负责将struts.xml文件中<action>标签下<param>标签中的参数传入action
Roles Interceptor roles 这是一个JAAS(Java Authentication and Authorization Service,Java授权和认证服务)拦截器,只有当浏览者取得合适的授权后,才可以调用被该拦截器拦截的Action
Timer Interceptor timer 以执行action所花时间的形式,简单记录action概要信息,此拦截器负责输出Action的执行时间,可以利用此拦截器分析该Action的性能瓶颈
Token Interceptor token 以执行action所花时间的形式,简单记录action概要信息,此拦截器负责输出Action的执行时间,可以利用此拦截器分析该Action的性能瓶颈
Token Session Interceptor tokenSession 和Token类似,但是遇到无效的token会将提交数据保存到session中
Validation Interceptor validation 通过执行在xxxAction-validation.xml中定义的校验器,从而完成数据校验。
Default Workflow Interceptor workflow 为action定义默认的工作流,一般跟在validation等其他拦截器后,当验证失败时,不执行action然后重定向到INPUT视图
Parameter Filter Interceptor N/A 控制action对参数的访问(非默认配置
Profiling Interceptor profiling 允许action记录简单的概要信息日志
Multiselect Interceptor multiselect 当一个select标签设置成多选后(就是你写的这种),没有一个option被选中的时候,会自动设置一个空值

3.自定义拦截器

所有的拦截器都必须实现com.opensymphony.xwork2.interceptor.Interceptor这个接口,如下:

public interface Interceptor extends Serializable {
 
    void destroy();
 
    void init();
 
    String intercept(ActionInvocation invocation) throws Exception;
}

struts2的每一个request会请求一个action,因此不用担心线程安全问题,但是Interceptor会在多个request的中使用,所以必须要保证线程安全。

我们自定义的拦截器可以继承 AbstractInterceptor抽象类, AbstractInterceptor提供了一个而空的init和destory方法,若没有实现这两个方法的需求,可以直接重写intercept方法。

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
 
public class SimpleInterceptor extends AbstractInterceptor {
 
    public String intercept(ActionInvocation invocation) throws Exception {
       MyAction action = (MyAction)invocation.getAction();
       action.setDate(new Date());
       return invocation.invoke();
    }
}

然后在struts2.xml文件中进行配置


   <package name="struts-default">
      <interceptors>
         <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
         <interceptor name="MyInterceptor" class="com.opensymphony.xwork2.spring.interceptor.SimpleInterceptor"/>
         ...
      </interceptors>
   </package>