拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
2. Struts2默认拦截器栈:
拦截器 | 名字 | 说明 |
Alias Interceptor | alias | 在不同请求之间将请求参数在不同名字件转换,请求内容不变 |
Chaining Interceptor | chain | 让前一个Action的属性可以被后一个Action访问,现在和chain类型的result(<result type=”chain”>)结合使用。 |
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文件中将<action>中的<param>中的内容设置到对应的Action中。 |
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>
<!-- name: 拦截器的名称,class:自定义拦截器的类 -->
<interceptor name="拦截器名称" class="自定义拦截器的class路径" />
</ interceptors > 3.2.1. 使用拦截器,在需要使用自定义拦截器的action中定义如下代码 < action ><interceptor-ref name="拦截器名称"/>
</action>
注意:
因为struts2的很多功能都是根据拦截器实现的;如果此处只使用自定义的拦截器时,将失去struts2的很多核心功能;所以需要定义一个拦截器栈(由一个或多个拦截器组成)
3.2.2. 拦截器栈
<interceptor-stack name="拦截器栈的名称">
<!-- 需要注意的是:系统默认的拦截器栈应要放在前面,在加入自定义拦截器; -->
<interceptor-ref name="defaultState" />
<interceptor-ref name="自定义拦截器的名称" />
</ interceptor-stack > 3.2.3. 在action中使用栈 < action ><interceptor-ref name="栈名称或拦截器名称"/>
。。。。。。
</action>
3.2.3. 如果此时需要所有的action都使用自定义拦截器时,此时就定义一个默认的拦截器
<default-interceptor-ref name="permissionStack"/>
注意:如果在某个action中又使用了另一个拦截器,此时默认的拦截器将失效,为了确保能够使用默认的拦截器,又需要添加其他拦截器时,可以在action中加上其他拦截器
3.2.3. 配置文件
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="my" extends="struts-default">
<interceptors>
<!-- 定义权限控制拦截器 -->
<interceptor name="permissions"
class="com.perm.interceptor.PermissionsInterceptor" />
<!-- 定义一个包含权限控制的拦截器栈 -->
<interceptor-stack name="c">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="permissions" />
</interceptor-stack>
</interceptors>
<!-- 定义默认拦截器 -->
<default-interceptor-ref name="permissionsStack" />
<!-- 定义全局处理结果 -->
<global-results>
<!-- 逻辑名为error的结果,映射到/message.jsp页面 -->
<result name="error">/message.jsp</result>
</global-results>
<action name="listall"
class="com.perm.action.UserAction"
method="listAllUser">
<result name="success">/listall.jsp</result>
</action>
</package>
</struts>