Struts2拦截器

1.拦截器简介

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

因为拦截器在action执行先后都会被执行,因此struts2的框架的核心功能大部分都做为拦截器进行实现,好比类型转换、数据验证等等,而且这些功能都是可插拔的,因此在使用时能够决定action使用哪些功能。自定义的拦截器能够和框架内置的拦截器进行混合使用,通常状况拦截器都被默认配置成为action执行的基础。若类型转换失败,或者数据验证失败,拦截器就会阻止action的执行。spring

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中。cookie

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这个接口,以下:session

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方法。jsp

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文件中进行配置ide

<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>
相关文章
相关标签/搜索