第九章 拦截器
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 278.25pt; HEIGHT: 264pt" alt="" type="#_x0000_t75"><imagedata o:href="file:///C:\Struts2Dev\struts-2.0.9\docs\docs\nutshell.data\struts2-arch.png" src="file:///C:%5CDOCUME~1%5Cmazhao%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png"></imagedata><shadow opacity=".5" offset="6pt,6pt"></shadow></shape>
拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作。
每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面。
如何自定义一个拦截器?
自定义一个拦截器需要三步:
1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。
2 在strutx.xml中注册上一步中定义的拦截器。
3 在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。
Interceptor接口声明了三个方法:
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
Init方法在拦截器类被创建之后,在对Action镜像拦截之前调用,相当于一个post-constructor方法,使用这个方法可以给拦截器类做必要的初始话操作。
Destroy方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源。
Intercept是拦截器的主要拦截方法,如果需要调用后续的Action或者拦截器,只需要在该方法中调用invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后拦截器需要做的方法。如果不需要调用后续的方法,则返回一个String类型的对象即可,例如Action.SUCCESS。
另外AbstractInterceptor提供了一个简单的Interceptor的实现,这个实现为:
public abstract class AbstractInterceptor implements Interceptor {
public void init() {
}
public void destroy() {
}
public abstract String intercept(ActionInvocation invocation) throws Exception;
}
在不需要编写init和destroy方法的时候,只需要从AbstractInterceptor继承而来,实现intercept方法即可。
我们尝试编写一个Session过滤用的拦截器,该拦截器查看用户Session中是否存在特定的属性(LOGIN属性)如果不存在,中止后续操作定位到LOGIN,否则执行原定操作,代码为:
public class CheckLoginInterceptor extends AbstractInterceptor {
public static final String LOGIN_KEY = "LOGIN";
public static final String LOGIN_PAGE = "global.login";
public String intercept(ActionInvocation actionInvocation) throws Exception {
System.out.println("begin check login interceptor!");
// 对LoginAction不做该项拦截
Object action = actionInvocation.getAction();
if (action instanceof LoginAction) {
System.out.println("exit check login, because this is login action.");
return actionInvocation.invoke();
}
// 确认Session中是否存在LOGIN
Map session = actionInvocation.getInvocationContext().getSession();
String login = (String) session.get(LOGIN_KEY);
if (login != null && login.length() > 0) {
// 存在的情况下进行后续操作。
System.out.println("already login!");
return actionInvocation.invoke();
} else {
// 否则终止后续操作,返回LOGIN
System.out.println("no login, forward login page!");
return LOGIN_PAGE;
}
}
}
注册拦截器
<interceptors>
<interceptor
name="login"
class="com.jpleasure.teamware.util.CheckLoginInterceptor"/>
<interceptor-stack name="teamwareStack">
<interceptor-ref name="login"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
将上述拦截器设定为默认拦截器:
<default-interceptor-ref name="teamwareStack"/>
这样在后续同一个package内部的所有Action执行之前都会被login拦截。
Struts2(XWork)提供的拦截器的功能说明:
拦截器
|
名字
|
说明
|
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
|
注册并引用Interceptor
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="timer" class=".."/>
<interceptor name="logger" class=".."/>
</interceptors>
<action name="login" class="tutorial.Login">
<interceptor-ref name="timer"/>
<interceptor-ref name="logger"/>
<result name="input">login.jsp</result>
<result name="success"
type="redirect-action">/secure/home</result>
</action>
</package>
可以将多个拦截器合并在一起作为一个堆栈调用,当一个拦截器堆栈被附加到一个Action的时候,要想Action执行,必须执行拦截器堆栈中的每一个拦截器。
<package name="default" extends="struts-default">
<interceptors>
MsoNorm
分享到:
相关推荐
在Spring MVC的配置文件(通常是`dispatcher-servlet.xml`)中,我们需要声明一个`<mvc:interceptors>`元素来定义拦截器。在其中,可以创建一个或多个`<mvc:interceptor>`子元素,每个子元素代表一个拦截器。需要...
5. **配置拦截器**:在`struts.xml`或相关的配置文件中,通过`<interceptors>`和`<interceptor>`元素来定义和注册拦截器。同时,`<action>`元素中的`interceptor-ref`用于指定拦截器栈的引用。 6. **拦截器链**:...
在这个场景中,"probe-interceptors"可能是一个专门设计用于扩展和增强探针功能的库,特别是通过拦截器(Interceptor)的概念。拦截器是一种设计模式,它允许在方法调用前后插入自定义的行为,从而实现如日志记录、...
2. **拦截器(Interceptors):** 拦截器是Struts2中实现AOP(面向切面编程)的关键机制,它们允许在Action调用前后插入额外的行为。常见的拦截器包括验证、日志记录、事务管理等。本章可能深入解析拦截器的工作原理...
9. **第九章: strut2整合其他技术** - Struts 2与Spring框架的集成,实现依赖注入 - 集成Hibernate或MyBatis进行持久层操作 - 使用Tiles进行页面布局 10. **第十章:异常处理** - Struts 2的全局异常处理机制...
第16章可能详细解释了如何创建和配置自定义拦截器,并展示了它们在实际场景中的应用。 2. **结果类型(Result Types)**:Struts2支持多种结果类型,如dispatcher、stream、freemarker等,用于控制请求响应的处理...
第12章可能详细讲解了如何创建和使用自定义拦截器,以及常用的内置拦截器如params、validation、i18n等。 4. **模型-视图-控制器(MVC)架构**:Struts2遵循MVC设计模式,使得业务逻辑、数据和展示分离。本章可能...
3. **拦截器(Interceptors)**:Struts2的拦截器机制允许在Action执行前后插入自定义逻辑,如日志记录、权限检查、事务管理等。这部分可能会介绍常用的内置拦截器和如何编写自定义拦截器。 4. **模型驱动...
第20章可能包含自定义拦截器的实现和配置示例。 3. **Tiles布局**:Tiles是Struts的一个扩展,用于创建复杂的页面布局。它允许将页面拆分为可重用的部分(tiles),便于维护和设计一致的界面。本章可能涉及如何集成...
第8章可能详细讲解了如何创建和配置拦截器。 3. **配置文件(struts.xml)**:这是Struts2的核心配置文件,用于定义Action、结果类型、拦截器栈等。第8章可能会介绍如何编写和理解这个文件。 4. **OGNL(Object-...
“第九章 EJB3Unit单元测试”讲述了如何使用EJB3Unit进行单元测试,确保代码质量。虽然Struts2本身不直接关联EJB,但EJB3Unit可以帮助测试Action和Service层的逻辑。 “第十章 静态参数与session request response...
1. **拦截器(Interceptors)**:Struts 2的核心组件之一,拦截器允许在Action调用前后执行自定义逻辑。本章可能深入讲解拦截器的实现、配置和常见应用场景,如日志记录、事务管理、性能监控等。 2. **结果类型...
第3章可能解释了如何定义和使用自定义拦截器。 4. **结果类型**:了解不同的结果类型,如dispatcher(转发)、stream(流式结果,常用于下载文件)、redirect(重定向)等,以及如何根据业务需求选择合适的结果类型...
2. **拦截器(Interceptors)**:Struts2的核心特性之一是拦截器,它们可以用来添加日志、事务管理、性能监控等通用功能。源码中可能包含自定义拦截器的实现和它们在拦截器栈中的配置。 3. **结果类型(Result ...
7. 拦截器(Interceptors):Struts2引入了拦截器的概念,它们在Action执行前后执行,可以实现登录检查、日志记录、性能监控等多种功能。开发者需要理解如何配置和编写自定义拦截器。 8. 配置文件:struts.xml是...
4. **拦截器(Interceptors)**:拦截器是Struts2的一个强大特性,用于在Action调用前后执行一些通用操作,如日志记录、权限检查、事务管理等。源码中可能会有自定义拦截器的实现。 5. **结果类型(Result Types)*...
3. **拦截器(Interceptors)**:拦截器是Struts2中的一个强大特性,允许在Action执行前后插入额外的功能,如日志、权限检查、性能监控等。学习如何编写和使用自定义拦截器,以及如何在配置文件中配置拦截器栈,将...
3. **拦截器(Interceptors)**:Struts2的拦截器是其强大的特性之一,允许在Action执行前后插入自定义逻辑。源码分析将揭示拦截器链的工作机制,以及如何编写和注册自定义拦截器。 4. **Value Stack与OGNL**:Struts...
**第九章:结果类型和插件** 探索不同的结果类型,如Redirect、RedirectAction等,以及Struts2提供的各种插件,如Freemarker、Velocity模板引擎。 **第十章:Struts2与Ajax** 理解Struts2如何与Ajax技术结合,实现...
第15章可能会详细解释如何自定义拦截器,以及如何在配置文件中配置它们。 2. **结果类型(Result Types)**:Struts2支持多种结果类型,用于决定处理动作后的页面跳转。常见的有"dispatcher"(用于转发到JSP页面)...