`

struts2 拦截器

阅读更多

转自http://blog.csdn.net/qjyong/article/details/1824607

 

Struts2 拦截器 (Interceptor)

                                                               ++YONG 原创,转载请注明

1.    理解拦截器

1.1.    什么是拦截器:

拦截器,在 AOP Aspect-Oriented Programming )中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是 AOP 的一种实现策略。

Webwork 的中文文档的解释为——拦截器是动态拦截 Action 调用的对象。它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也可以在一个 action 执行前阻止其执行。同时也是提供了一种可以提取 action 中可重用的部分的方式。

谈到拦截器,还有一个词大家应该知道——拦截器链( Interceptor Chain ,在 Struts 2 中称为拦截器栈 Interceptor Stack )。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

1.2.    拦截器的实现原理:

大部分时候,拦截器方法都是通过代理的方式来调用的。 Struts 2 的拦截器实现相对简单。当请求到达 Struts 2 ServletDispatcher 时, Struts 2 会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表( list ),最后一个一个地调用列表中的拦截器。如下图:

 

2.    拦截器的配置

Struts 2 已经为您提供丰富多样的,功能齐全的拦截器实现。大家可以至 struts2 jar 包内的 struts-default.xml 查看关于默认的拦截器与拦截器链的配置。

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

 

       struts.xml 文件中定义拦截器,拦截器栈:

< package name = "my" extends = "struts-default" namespace = "/manage" >

        < interceptors >

        <!-- 定义拦截器 -->

        < interceptor name = " 拦截器名 " class = " 拦截器实现类 " />

        <!-- 定义拦截器栈 -->

        < interceptor-stack name = " 拦截器栈名 " >

             < interceptor-ref name = " 拦截器一 " />

             < interceptor-ref name = " 拦截器二 " />

        </ interceptor-stack >

        </ interceptors >

        ......

</package>

3.    使用拦截器

一旦定义了拦截器和拦截器栈后,就可以使用这个拦截器或拦截器栈来拦截 Action 了。拦截器的拦截行为将会在 Action exceute 方法执行之前被执行。

< action name = "userOpt" class = "org.qiujy.web.struts2.action.UserAction" >

            < result name = "success" > /success.jsp </ result >

            < result name = "error" > /error.jsp </ result >

<!-- 使用拦截器 , 一般配置在 result 之后, -->

<!-- 引用系统默认的拦截器 -->

< interceptor-ref name = "defaultStack" />

            < interceptor-ref name = " 拦截器名或拦截器栈名 " />

        </ action >

       此处需要注意的是,如果为 Action 指定了一个拦截器,则系统默认的拦截器栈将会失去作用。为了继续使用默认拦截器,所以上面配置文件中手动引入了默认拦截器。

4.    自定义拦截器

作为“框架( framework )”,可扩展性是不可或缺的。虽然, Struts 2 为我们提供如此丰富的拦截器实现,但是这并不意味我们失去创建自定义拦截器的能力,恰恰相反,在 Struts 2 自定义拦截器是相当容易的一件事。

4.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 方法。

4.2.    使用自定义拦截器:

两个步骤:

l   通过 <interceptor …> 元素来定义拦截器。

l   通过 <interceptor-ref …> 元素来使用拦截器。

5.    自定义拦截器示例

5.1.    问题描述:

使用自定义拦截器来完成用户权限的控制:当浏览者需要请求执行某个操作时,应用需要先检查浏览者是否登录,以及是否有足够的权限来执行该操作。

5.2.    实现权限控制拦截器类:

AuthorizationInterceptor.java

package org.qiujy.common;

 

import java.util.Map;

 

import com.opensymphony.xwork2.Action;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

 

/**

  * 权限检查拦截器

  *

  * @author qiujy

  * @version 1.0

  */

public class AuthorizationInterceptor extends AbstractInterceptor {

 

    /*

      * 拦截 Action 处理的拦截方法

      *

      */

    public String intercept(ActionInvocation invocation) throws Exception {

       

        Map session = invocation.getInvocationContext().getSession();

        String userName = (String) session.get( "userName" );

       

        if ( null != userName && userName.equals( "test" )) {

            System. out .println( " 拦截器:合法用户登录 ---" );

            return invocation.invoke();

        } else {

            System. out .println( " 拦截器:用户未登录 ---" );

            return Action. LOGIN ;

        }

    }

}

 

5.3.    配置权限控制拦截器:

struts.xml

<! 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 = "authority" class = "org.qiujy.common.AuthorizationInterceptor" />

        </ interceptors >

       

        <!-- 定义全局处理结果 -->

         < global-results >

        <!-- 逻辑名为 login 的结果,映射到 /login.jsp 页面 -->

        < result name = "login" > /login.jsp </ result >

        </ global-results >

       

        < action name = "listall" class = "org.qiujy.web.struts2.action.UserAction" method = "listAllUser" >

            < result name = "success" > /listall.jsp </ result >

            <!-- 使用拦截器 -->

            < interceptor-ref name = "defaultStack" />

            < interceptor-ref name = "authority" />

        </ action >

       

        < action name = "userOpt" class = "org.qiujy.web.struts2.action.UserAction" >

            < result name = "success" > /success.jsp </ result >

        </ action >

    </ package >

</ struts >

       其它页面见源代码。

5.4.    运行调试:

在浏览器地址栏直接输入 http://localhost:8080/AuthorityInterceptorDemo/listall.action 来访问,此动作配置了权限拦截器,所有被转到登录页面。

 

登录后:

 

再访问 http://localhost:8080/AuthorityInterceptorDemo/listall.action 这个链接:

 

如果为了简化 struts.xml 文件的配置,避免在每个 Action 重复配置该拦截器,可以将拦截器配置成了一个默认拦截器栈。如下:

<! 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 = "authority"

                class = "org.qiujy.common.AuthorizationInterceptor" />

            <!-- 定义一个包含权限控制的拦截器栈 -->

            < interceptor-stack name = "mydefault" >

                < interceptor-ref name = "defaultStack" />

                < interceptor-ref name = "authority" />

            </ interceptor-stack >

        </ interceptors >

       

        <!-- 定义默认拦截器 -->

        < default-interceptor-ref name = "mydefault" />

 

        <!-- 定义全局处理结果 -->

        < global-results >

            <!-- 逻辑名为 login 的结果,映射到 /login.jsp 页面 -->

            < result name = "login" > /login.jsp </ result >

        </ global-results >

 

        < action name = "listall"

            class = "org.qiujy.web.struts2.action.UserAction"

            method = "listAllUser" >

            < result name = "success" > /listall.jsp </ result >

        </ action >

    </ package >

   

    < package name = "font" extends = "struts-default" >

        < action name = "userOpt" class = "org.qiujy.web.struts2.action.UserAction" >

            < result name = "success" > /success.jsp </ result >

        </ action >

    </ package >

</ struts >

一旦在某个包下定义了默认拦截器栈,在该包下的所有 action 都会使用此拦截器栈。对于那些不想使用些拦截器栈的 action ,则应该将它放置在其它的包下。


分享到:
评论

相关推荐

    Struts2拦截器及其用法详细说明

    在Struts2中,拦截器(Interceptors)扮演着核心角色,增强了框架的功能和灵活性。这篇文章将深入探讨Struts2拦截器的概念、工作原理以及如何在实际应用中使用它们。 **一、什么是Struts2拦截器** 拦截器是基于AOP...

    struts2拦截器

    标题“struts2拦截器”指的是Struts2框架中的拦截器机制,这是一个关键的组件,可以让我们在不修改实际业务代码的情况下,实现对请求处理流程的扩展和定制。 描述中提到的“基于struts2的拦截器测试,实现了页面的...

    Struts2拦截器(Interceptor)

    Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)

    Struts2 拦截器

    拦截器是Struts2框架的核心特性之一,它们扮演着处理请求、增强功能和实现业务逻辑的角色。在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的...

    详解Struts2拦截器

    ### Struts2拦截器详解 #### 一、Struts2拦截器概述 Struts2框架作为Java Web开发中的一种流行框架,其核心组件之一便是**拦截器**。拦截器不仅在Struts2中扮演着重要角色,更是整个框架灵活性与扩展性的基石。...

    struts2 拦截器实例

    在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在Action执行前后插入自定义的逻辑,如日志、权限检查、事务管理等。现在我们将深入探讨Struts2的拦截器机制及其实例应用。 ### 一、Struts2拦截...

    Struts2拦截器实现权限控制demo

    在这个“Struts2拦截器实现权限控制demo”中,我们将深入探讨如何利用拦截器来实现细粒度的用户权限管理。 首先,我们需要了解Struts2中的拦截器工作原理。拦截器是基于Java的动态代理模式实现的,它们按照配置的...

    struts2拦截器的使用方法

    ### Struts2拦截器的使用方法 #### 一、Struts2拦截器概述 Struts2框架中的拦截器(Interceptor)是一种重要的机制,用于在Action执行前后进行一系列处理,比如参数验证、数据预处理等。它能够帮助开发者更加灵活...

    struts2拦截器应用小例子

    当请求到达控制器时,Struts2会依次调用这个栈中的拦截器,每个拦截器都有机会处理请求,然后决定是否将请求传递给下一个拦截器或直接返回响应。 创建一个简单的Struts2拦截器,你需要遵循以下步骤: 1. 创建拦截...

    Struts2拦截器.ppt

    Struts2拦截器.ppt Struts2拦截器.ppt Struts2拦截器.ppt

    Struts2拦截器原理分析

    拦截器是Struts2框架的核心组成部分,它们在请求处理流程中起到了关键的作用。在本文中,我们将深入探讨Struts2拦截器的工作原理。 ### 一、拦截器概念 拦截器是基于Java的动态代理机制实现的,它允许我们在Action...

    struts2拦截器实现拦截不文明字迹

    拦截器是Struts2框架的一个重要组成部分,能够帮助开发者实现一些在请求处理前后执行的通用逻辑,如日志记录、权限验证、数据校验等。在本场景中,我们将探讨如何使用Struts2拦截器来实现对不文明字迹或者敏感词汇的...

    Struts2 拦截器注解(二十七)

    拦截器是Struts2框架的核心组件之一,它允许开发者在动作执行前后插入自定义逻辑,实现如权限验证、日志记录、性能优化等多种功能。在"Struts2 拦截器注解"这个主题中,我们将深入探讨如何利用注解来简化拦截器的...

    Struts2 拦截器的执行顺序(二十九)

    这篇博客“Struts2 拦截器的执行顺序(二十九)”可能探讨了Struts2拦截器链的工作原理和它们的执行顺序,这对于理解Struts2的内部机制至关重要。 首先,让我们深入理解Struts2的拦截器。拦截器是在Action调用前后...

    struts2 拦截器实现登录控制

    这篇博客“struts2 拦截器实现登录控制”显然会探讨如何利用拦截器来实现用户登录验证,从而保护应用程序的受保护资源。 首先,我们了解下Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)的概念,它位于...

    struts2拦截器和验证框架(适合初学者-经藏版)

    ### Struts2 拦截器与验证框架详解 #### 一、Struts2概述 Struts2是一个基于Java的企业级Web应用开发框架,它继承了Struts1的优点,并在此基础上进行了很多改进,使得开发更加灵活高效。Struts2的核心是拦截器...

    Struts2拦截器源程序

    在Struts2中,拦截器扮演着至关重要的角色,它们是实现MVC(Model-View-Controller)架构的关键组件之一。拦截器允许开发者在动作执行前后插入自定义逻辑,比如日志记录、权限检查、数据验证等,而无需修改核心业务...

Global site tag (gtag.js) - Google Analytics