`
kobexing933
  • 浏览: 120292 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

第九章 拦截器(Interceptors)

阅读更多

第九章 拦截器

<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;

}

在不需要编写initdestroy方法的时候,只需要从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拦截。

Struts2XWork)提供的拦截器的功能说明:

拦截器

名字

说明

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调用ActionsetModel方法将其放入Action内部。

Parameters Interceptor

params

将请求中的参数设置到Action中去。

Prepare Interceptor

prepare

如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。

Scope Interceptor

scope

Action状态存入sessionapplication的简单方法。

Servlet Config Interceptor

servletConfig

提供访问HttpServletRequestHttpServletResponse的方法,以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

调用Actionvalidate方法,一旦有错误返回,重新定位到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

分享到:
评论

相关推荐

    springmvc 拦截器

    在Spring MVC的配置文件(通常是`dispatcher-servlet.xml`)中,我们需要声明一个`&lt;mvc:interceptors&gt;`元素来定义拦截器。在其中,可以创建一个或多个`&lt;mvc:interceptor&gt;`子元素,每个子元素代表一个拦截器。需要...

    Struts2 拦截器-v3

    5. **配置拦截器**:在`struts.xml`或相关的配置文件中,通过`&lt;interceptors&gt;`和`&lt;interceptor&gt;`元素来定义和注册拦截器。同时,`&lt;action&gt;`元素中的`interceptor-ref`用于指定拦截器栈的引用。 6. **拦截器链**:...

    probe-interceptors:“探针”库的附加拦截器

    在这个场景中,"probe-interceptors"可能是一个专门设计用于扩展和增强探针功能的库,特别是通过拦截器(Interceptor)的概念。拦截器是一种设计模式,它允许在方法调用前后插入自定义的行为,从而实现如日志记录、...

    struts2.1权威指南 第9章光盘源码

    2. **拦截器(Interceptors):** 拦截器是Struts2中实现AOP(面向切面编程)的关键机制,它们允许在Action调用前后插入额外的行为。常见的拦截器包括验证、日志记录、事务管理等。本章可能深入解析拦截器的工作原理...

    STRUTS 2完全学习手册源码 第1-14章

    9. **第九章: strut2整合其他技术** - Struts 2与Spring框架的集成,实现依赖注入 - 集成Hibernate或MyBatis进行持久层操作 - 使用Tiles进行页面布局 10. **第十章:异常处理** - Struts 2的全局异常处理机制...

    Struts2 权威指南 配套源码 第16章

    第16章可能详细解释了如何创建和配置自定义拦截器,并展示了它们在实际场景中的应用。 2. **结果类型(Result Types)**:Struts2支持多种结果类型,如dispatcher、stream、freemarker等,用于控制请求响应的处理...

    Struts2.1权威指南光盘源代码第12章

    第12章可能详细讲解了如何创建和使用自定义拦截器,以及常用的内置拦截器如params、validation、i18n等。 4. **模型-视图-控制器(MVC)架构**:Struts2遵循MVC设计模式,使得业务逻辑、数据和展示分离。本章可能...

    Struts2.1权威指南光盘源代码第5章

    3. **拦截器(Interceptors)**:Struts2的拦截器机制允许在Action执行前后插入自定义逻辑,如日志记录、权限检查、事务管理等。这部分可能会介绍常用的内置拦截器和如何编写自定义拦截器。 4. **模型驱动...

    Struts2.1权威指南光盘源代码第20章

    第20章可能包含自定义拦截器的实现和配置示例。 3. **Tiles布局**:Tiles是Struts的一个扩展,用于创建复杂的页面布局。它允许将页面拆分为可重用的部分(tiles),便于维护和设计一致的界面。本章可能涉及如何集成...

    Struts2.1权威指南光盘源代码第8章

    第8章可能详细讲解了如何创建和配置拦截器。 3. **配置文件(struts.xml)**:这是Struts2的核心配置文件,用于定义Action、结果类型、拦截器栈等。第8章可能会介绍如何编写和理解这个文件。 4. **OGNL(Object-...

    struts2的教程

    “第九章 EJB3Unit单元测试”讲述了如何使用EJB3Unit进行单元测试,确保代码质量。虽然Struts2本身不直接关联EJB,但EJB3Unit可以帮助测试Action和Service层的逻辑。 “第十章 静态参数与session request response...

    Struts 2.X权威指南 第20章

    1. **拦截器(Interceptors)**:Struts 2的核心组件之一,拦截器允许在Action调用前后执行自定义逻辑。本章可能深入讲解拦截器的实现、配置和常见应用场景,如日志记录、事务管理、性能监控等。 2. **结果类型...

    Struts2.1权威指南光盘源代码第3章

    第3章可能解释了如何定义和使用自定义拦截器。 4. **结果类型**:了解不同的结果类型,如dispatcher(转发)、stream(流式结果,常用于下载文件)、redirect(重定向)等,以及如何根据业务需求选择合适的结果类型...

    Struts2权威指南源代码第20章源码

    2. **拦截器(Interceptors)**:Struts2的核心特性之一是拦截器,它们可以用来添加日志、事务管理、性能监控等通用功能。源码中可能包含自定义拦截器的实现和它们在拦截器栈中的配置。 3. **结果类型(Result ...

    struts第5章

    7. 拦截器(Interceptors):Struts2引入了拦截器的概念,它们在Action执行前后执行,可以实现登录检查、日志记录、性能监控等多种功能。开发者需要理解如何配置和编写自定义拦截器。 8. 配置文件:struts.xml是...

    Struts2.1权威指南光盘源代码第21章

    4. **拦截器(Interceptors)**:拦截器是Struts2的一个强大特性,用于在Action调用前后执行一些通用操作,如日志记录、权限检查、事务管理等。源码中可能会有自定义拦截器的实现。 5. **结果类型(Result Types)*...

    Struts2.1权威指南光盘源代码第7章

    3. **拦截器(Interceptors)**:拦截器是Struts2中的一个强大特性,允许在Action执行前后插入额外的功能,如日志、权限检查、性能监控等。学习如何编写和使用自定义拦截器,以及如何在配置文件中配置拦截器栈,将...

    开发者突击 struts2 第二章 源代码

    3. **拦截器(Interceptors)**:Struts2的拦截器是其强大的特性之一,允许在Action执行前后插入自定义逻辑。源码分析将揭示拦截器链的工作机制,以及如何编写和注册自定义拦截器。 4. **Value Stack与OGNL**:Struts...

    struts2入门教程

    **第九章:结果类型和插件** 探索不同的结果类型,如Redirect、RedirectAction等,以及Struts2提供的各种插件,如Freemarker、Velocity模板引擎。 **第十章:Struts2与Ajax** 理解Struts2如何与Ajax技术结合,实现...

    Struts2.1权威指南光盘源代码第15章

    第15章可能会详细解释如何自定义拦截器,以及如何在配置文件中配置它们。 2. **结果类型(Result Types)**:Struts2支持多种结果类型,用于决定处理动作后的页面跳转。常见的有"dispatcher"(用于转发到JSP页面)...

Global site tag (gtag.js) - Google Analytics