默认的拦截器在设计的时候就能知足大部分的应用,因此不少时候就不须要添加自定义的拦截器或者修改拦截器栈。不少action有各类各样的需求,好比输入验证、文件上传、防止屡次提交等等。因而struts框架就提供了一个解决方案,Interceptor
策略。当你请求一个action时,在执行当前action以前,会执行拦截,执行完action以后会再次进行拦截。这个过程通称为拦截器
。java
因为拦截器在action执行先后都会被执行,因此struts2的框架的核心功能大部分都做为拦截器进行实现,好比类型转换、数据验证等等,而且这些功能都是可插拔的,因此在使用时能够决定action使用哪些功能。自定义的拦截器能够和框架内置的拦截器进行混合使用,通常状况拦截器都被默认配置成为action执行的基础。若类型转换失败,或者数据验证失败,拦截器就会阻止action的执行。spring
在大部分应用中,若是会屡次使用同一系列的拦截器,能够将这些拦截器进行整理,聚合成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被选中的时候,会自动设置一个空值 |
全部的拦截器都必须实现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>