1. 什么是拦截器:
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
2. Struts2默认拦截器栈:
| 拦截器 |
名字 |
说明 |
| Alias Interceptor |
alias |
在不同请求之间将请求参数在不同名字件转换,请求内容不变 |
| Chaining Interceptor |
chain |
让前一个Action的属性可以被后一个Action访问,现在和chain类型的result( |
| Checkbox Interceptor |
checkbox |
添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。 |
| Cookies Interceptor |
cookies |
使用配置的name,value来是指cookies |
| Conversion Error Interceptor |
conversionError |
将错误从ActionContext中添加到Action的属性字段中。 |
| Create Session Interceptor |
createSession |
自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。 |
| Debugging Interceptor |
debugging |
提供不同的调试用的页面来展现内部的数据状况。 |
| Execute and Wait Interceptor |
execAndWait |
在后台执行Action,同时将用户带到一个中间的等待页面。 |
| Exception Interceptor |
exception |
将异常定位到一个画面 |
| File Upload Interceptor |
fileUpload |
提供文件上传功能 |
| I18n Interceptor |
i18n |
记录用户选择的locale |
| Logger Interceptor |
logger |
输出Action的名字 |
| Message Store Interceptor |
store |
存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。 |
| Model Driven Interceptor |
model-driven |
如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。 |
| Scoped Model Driven |
scoped-model-driven |
如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。 |
| Parameters Interceptor |
params |
将请求中的参数设置到Action中去。 |
| Prepare Interceptor |
prepare |
如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。 |
| Scope Interceptor |
scope |
将Action状态存入session和application的简单方法。 |
| Servlet Config Interceptor |
servletConfig |
提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。 |
| Static Parameters Interceptor |
staticParams |
从struts.xml文件中将 |
| Roles Interceptor |
roles |
确定用户是否具有JAAS指定的Role,否则不予执行。 |
| Timer Interceptor |
timer |
输出Action执行的时间 |
| Token Interceptor |
token |
通过Token来避免双击 |
| Token Session Interceptor |
tokenSession |
和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中 |
| Validation Interceptor |
validation |
使用action-validation.xml文件中定义的内容校验提交的数据。 |
| Workflow Interceptor |
workflow |
调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面 |
| Parameter Filter Interceptor |
N/A |
从参数列表中删除不必要的参数 |
| Profiling Interceptor |
profiling |
通过参数激活profile |
3. 自定义拦截器的实现:
虽然,Struts 2为我们提供如此丰富的拦截器实现,但是在某种情况下并不能满足我们的需求,比如:访问控制的时候,在用户每次访问某个action时,我们要去校验用户是否已经登入,如果没有登入我们将在action执行之前就被拦截;此时我们就需要自定义拦截器;
3.1.实现拦截器类
所有的Struts 2的拦截器都直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor。该接口提供了三
个方法:
1) void init(); 在该拦截器被初始化之后,在该拦截器执行拦截之前,系统回调该方法。对于每个拦截器而言,此方法只执行一次。
2) void destroy();该方法跟init()方法对应。在拦截器实例被销毁之前,系统将回调该方法。
3) String intercept(ActionInvocation invocation) throws Exception; 该方法是用户需要实现的拦截动作。该方法会返回一个字符串作为逻辑视图。
除此之外,继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor是更简单的一种实现拦截器类的方式,
因为此类提供了init()和destroy()方法的空实现,这样我们只需要实现intercept方法。
3.2.注册自定义拦截器
自定义拦截器类实现了,现在就要在struts里注册这个拦截器;
3.2.1. 注册拦截器,在struts.xml中的package中注册拦截器
interceptors >
3.2.1. 使用拦截器,在需要使用自定义拦截器的action中定义如下代码
< action >
注意:
因为struts2的很多功能都是根据拦截器实现的;如果此处只使用自定义的拦截器时,将失去struts2的很多核心功能;所以需要定义一个拦截器栈(由一个或多个拦截器组成)
3.2.2. 拦截器栈
interceptor-stack >
3.2.3. 在action中使用栈
< action >
。。。。。。
3.2.3. 如果此时需要所有的action都使用自定义拦截器时,此时就定义一个