`

struts2拦截器的原理和写法(转)

    博客分类:
  • java
 
阅读更多
一、什么是拦截器?
提到拦截器,说得好听点,就是安全性检查,说得不好听,就是强盗。拦截器在程序应用中就是那个扮演强盗半路打劫的角色。 在我们的日常编程中少不了写一些 重复的代码,例如在一个地方中写了一段代码,后来发现这段代码在其它地方中同样需要,在传统的编程中我们一定会采取复制、粘贴的办法。如果这段代码只在这 一两个处需要,我们采取这种办法,还说的过去,但是如果系统对这段代码过于依赖,也就是这段代码在系统中出现的过多,如果那一天我们发现这段代码中在某些 地方还需要完善,我们要着个修改它们!!我估计没有人会这么做,它严重违反了软件开发中一条非常重要的可重用代码的规则,同时也是程序员非常讨厌的一件事,老是写重复代码会让一个程序员感到厌烦。说了这么多你一定知道我们为什么需要在程序中弄一个“劫匪”了吧。这个“劫匪”就是并不是劫取什么东西,只是为了在某个程序执行前后,动态的增加一些功能(以前所写通用代码块)或进行一些检查工作。那么这个拦截器到底是怎么实现的呢?实际上它是用Java中的动态代理来实现的

二、拦截器在Struts2中的应用

对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作。像params拦截器将http请求中参数解析出来赋值给Action中对应的属性。Servlet-config拦截器负责把请求中HttpServletRequest实例和HttpServletResponse实例传递给Action……struts2内置的拦截器有很多,在此我就不一一列举了

那么怎么在struts2中定义自己的拦截器呢?

很简单Struts2为我们提供了一个Interceptor接口,该接口源代码如下:

publicinterface Interceptor extends Serializable {

    void destroy();

    void init();

    String intercept(ActionInvocation invocation) throws Exception;

}

1)    init():在拦截器执行之前调用,主要用于初始化系统资源。

2)    destroty():与init()对应,用于拦截器执行之后销毁资源。

3)    intercept():拦截器的核心方法,实现具体的拦截操作。与action一样,该方法也返回一个字符串作为逻辑视图。如果拦截器成功调用了action,则返回一个真正的,也就是该action中execute()方法返回的逻辑视图,反之,则返回一个自定义的逻辑视图。

通常我们使用拦截器并不需要申请资源,为此Struts2还为我们提供了一个AbstractInterceptor类,该类的init()和destroy()都是空实现。我们开发自己的拦截器只需要继承这个类就行了。

下面创建一个判断用户是否登录的拦截器。代码如下:

struts.xml中配置一下。

**
*
* @author <a href="mailto:flustar2008@163.com">flustar</a>
* @version 1.0
* Creation date: Feb 12, 2008 5:05:28 PM
*/

import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

@SuppressWarnings("serial")
public class CheckLoginInterceptor extends AbstractInterceptor {

    @SuppressWarnings("unchecked")
    public String intercept(ActionInvocation actionInvocation) throws Exception {
         System.out.println("begin check login interceptor!");

            // 检查Session中是否存在user

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

            String username = (String) session.get("user");

            if (username != null && username.length() > 0) {

                // 存在的情况下进行后续操作。

                System.out.println("already login!");

                return actionInvocation.invoke();

            } else {

                // 否则终止后续操作,返回LOGIN

                System.out.println("no login, forward login page!");

                return Action.LOGIN;

            }

        }


    }


创建好拦截器后,还不能使用,还需要我们在
下面看一下怎么配置拦截器。

<interceptors>

           <interceptor name="checkLogin" class="com.myblog.interceptor.CheckLoginInterceptor" />

</interceptors>


这个定义好的拦截器在Action中怎么使用呢?使用方法很简单,如下:

<action name=" " class=" " >

           <result> </result>

           <interceptor-ref name="checkLogin" />

</action>


一旦我们为某个action引用了自定义的拦截器,struts2默认的拦截器就不会再起作用,因此还需要引用默认拦截器。

<action name=" " class=" " >

           <result> </result>

           <interceptor-ref name="checkLogin" />

                     <interceptor-ref name="defaultStack" />

</action>

但是我们这么做似乎也不太方便,因为如果拦截器checkLogin需要被多个action引用的话,每一个都要配置一遍太麻烦了。我们可以把它定义成默认的拦截器。

<interceptors>

           <interceptor name="checkLogin" class="com.myblog.interceptor.CheckLoginInterceptor" />

           <!—-定义一个拦截器栈-->

           <interceptor-stack name="mydefault">

              <interceptor-ref name="defaultStack" />

              <interceptor-ref name="checkLogin" />

           </interceptor-stack>

</interceptors>

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


另外,struts2还为我们提供了一个方法过滤的拦截器MethodFilterInterceptor类,该类继承AbstractInterceptor类,重写了intercept(ActionInvocation invocation)并提供了一个新的方法doInterceptor(ActionInvocation invocation)抽象方法。该类的使用方法很简单,就不举例了。这个拦截器与以往的拦截器配置有所不同。那就是可以指定哪些方法需要被拦截,那些不需要。通常在引用该拦截器时指定。

<interceptor-ref name="  ">

       <param name="exculdeMethods"></param>

       <param name="includeMethods"></param>   

</interceptor-ref>

exculdeMethods:是不被拦截的方法,如果有多个以逗号分隔。

includeMethods:需要被拦截的方法,如果有多个以逗号分隔。

PS:该文章参考了别人的一篇文章,例子我也懒得改动了。不过挺好的。如果要掌握好struts2的拦截器原理还需要认真学习下java的动态代理,同时给个建议:在性能要求较高的项目里面,使用动态代理会降低系统的性能
分享到:
评论

相关推荐

    struts2 拦截器写法

    Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.

    struts2注解配置Action及拦截器几种不同方式写法对应的路径指向.docx

    下面,我们将通过详细的解释和示例代码,来介绍 Struts2 中的注解配置 Action 及拦截器几种不同方式的写法对应的路径指向。 一、Struts2 中的 Action 在 Struts2 中,Action 是处理用户请求的核心组件。Action ...

    Struts2 ——2、各种Action写法和配置

    同时,熟悉Struts2的拦截器机制和DMI功能,可以更方便地实现业务逻辑的扩展和复用。对于源码的探索,有助于深入理解Struts2的工作原理,提升问题排查和性能优化的能力。在实际工作中,结合工具如IDEA的插件,可以...

    java过滤器、监听器拦截器原理个人总结.pdf

    Struts2 拦截器的实现原理相对简单,当请求 Struts2 的 action 时,Struts 2 会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器。 Struts2 规定用户自定义...

    struts2自学文档

    - **拦截器**:Struts2的核心之一,通过拦截器可以实现诸如文件上传、输入验证等功能。 - **处理与分配流程**: - **前端请求**:用户发起的HTTP请求。 - **StrutsPrepareAndExecuteFilter**:处理请求的第一道...

    struts2 权威指南 源码

    2. **拦截器(Interceptors)**:Struts2的核心特性之一就是拦截器,它们在Action执行前后进行一系列的操作,如日志记录、权限验证等。通过源码,我们可以研究不同拦截器的实现机制及其组合使用方式。 3. **配置文件...

    SpringBoot 自定义拦截器 的 源代码

    我们对拦截器并不陌生,无论是 Struts 2 还是 Spring MVC 中都提供了拦截器功能,它可以根据 URL 对请求进行拦截,主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能上。Spring Boot 同样提供了...

    struts.xml配置文件详解

    拦截器是Struts 2中非常重要的一个概念,主要用于处理横切关注点。例如,日志记录、事务管理等都可以通过定义拦截器来实现。 - **name**:拦截器名称。 - **class**:拦截器对应的实现类。 示例代码如下: ```xml ...

    struts2.0学习笔记

    配置`web.xml`文件,设置Struts2的过滤器,以便拦截所有请求: ```xml &lt;filter-name&gt;struts2 &lt;filter-class&gt;org.apache.struts2.dispatcher.FilterDispatcher &lt;filter-name&gt;struts2 &lt;url-pattern&gt;/* ``` ...

    个人博客系统 ssh2

    Struts2具有强大的拦截器机制,可以方便地添加如日志、权限控制等功能。此外,Struts2的OGNL表达式语言简化了数据绑定和视图渲染。 2. **Hibernate**:是一个对象关系映射(ORM)工具,它允许开发者用Java对象来...

    中英文简历的写法,想写好简历就下吧。

    Struts2提供了强大的拦截器机制和丰富的插件,便于开发者实现复杂的业务逻辑和页面控制。 Hibernate框架是一个对象关系映射(ORM)工具,它允许开发者使用面向对象的方式操作数据库,减少了手动编写SQL语句的工作量...

    J2EE框架考试试题借鉴.pdf

    3) Struts2框架的主要组件,如Action、拦截器、结果视图以及过滤器配置。 4) Hibernate框架的配置,如sessionFactory的配置,以及通过注解或XML文件设置对象关系映射。 5) Spring框架的组件和概念,包括IoC容器、AOP...

    面试问题整理面试问题整理

    * Struts2 使用拦截器来处理请求,而 Struts1 使用 Action。 * Struts2 使用 OGNL 表达式来访问 JavaBean 的属性,而 Struts1 使用 JSTL。 Hibernate 的优点和缺点 Hibernate 是一个 ORM 框架,它提供了很多优点:...

    简单的SSH三层架构+Ajax实现Google自动搜索极为相似版+直接Excel导入数据库

    它提供了拦截器(Interceptor)机制,可以方便地添加额外的功能和拦截器链。 2. **Spring**:是应用管理容器,负责管理和协调各种组件,包括事务管理、依赖注入(DI)和面向切面编程(AOP)。Spring还提供了与...

    Java学习笔记-个人整理的

    \contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...

    公司面试题实战

    - **Struts2**: Struts2框架的核心组件是拦截器,它负责处理用户请求,并将其传递给Action处理。Action处理完后,将控制权交给结果(Result),由结果负责展示数据。 **3. 编写一个能够体现单例模式思想的类** ```...

Global site tag (gtag.js) - Google Analytics