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>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。