`
zsmud
  • 浏览: 73400 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

struts2 拦截器原理

 
阅读更多
struts2 拦截器堆栈是由一个ActionInvocation的东东递归调用执行的过程,
在堆栈的底部是由action,PreResultListener,Result组成的东东。


/**   
 * @throws ConfigurationException If no result can be found with the returned code   
 */   
public String invoke() throws Exception {    
    String profileKey = "invoke: ";    
    try {    
        UtilTimerStack.push(profileKey);    
                
        if (executed) {    
            throw new IllegalStateException("Action has already executed");    
        }    
        // 依次调用拦截器堆栈中的拦截器代码执行    
        if (interceptors.hasNext()) {    
            final InterceptorMapping interceptor = (InterceptorMapping) interceptors.next();    
            UtilTimerStack.profile("interceptor: "+interceptor.getName(),     
                    new UtilTimerStack.ProfilingBlock<String>() {    
                        public String doProfiling() throws Exception {    
                         // 将ActionInvocation作为参数,调用interceptor中的intercept方法执行    
                            resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);    
                            return null;    
                        }    
            });    
        } else {    
            resultCode = invokeActionOnly();    
        }    
   
        // this is needed because the result will be executed, then control will return to the Interceptor, which will    
        // return above and flow through again    
        if (!executed) {    
            // 执行PreResultListener    
            if (preResultListeners != null) {    
                for (Iterator iterator = preResultListeners.iterator();    
                    iterator.hasNext();) {    
                    PreResultListener listener = (PreResultListener) iterator.next();    
                            
                    String _profileKey="preResultListener: ";    
                    try {    
                            UtilTimerStack.push(_profileKey);    
                            listener.beforeResult(this, resultCode);    
                    }    
                    finally {    
                            UtilTimerStack.pop(_profileKey);    
                    }    
                }    
            }    
   
            // now execute the result, if we're supposed to    
            // action与interceptor执行完毕,执行Result    
            if (proxy.getExecuteResult()) {    
                executeResult();    
            }    
   
            executed = true;    
        }    
   
        return resultCode;    
    }    
    finally {    
        UtilTimerStack.pop(profileKey);    
    }    
}  
/**
 * @throws ConfigurationException If no result can be found with the returned code
 */
public String invoke() throws Exception {
    String profileKey = "invoke: ";
    try {
     UtilTimerStack.push(profileKey);
      
     if (executed) {
      throw new IllegalStateException("Action has already executed");
     }
        // 依次调用拦截器堆栈中的拦截器代码执行
     if (interceptors.hasNext()) {
      final InterceptorMapping interceptor = (InterceptorMapping) interceptors.next();
      UtilTimerStack.profile("interceptor: "+interceptor.getName(), 
        new UtilTimerStack.ProfilingBlock<String>() {
      public String doProfiling() throws Exception {
                         // 将ActionInvocation作为参数,调用interceptor中的intercept方法执行
          resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);
          return null;
      }
      });
     } else {
      resultCode = invokeActionOnly();
     }

     // this is needed because the result will be executed, then control will return to the Interceptor, which will
     // return above and flow through again
     if (!executed) {
            // 执行PreResultListener
      if (preResultListeners != null) {
       for (Iterator iterator = preResultListeners.iterator();
        iterator.hasNext();) {
        PreResultListener listener = (PreResultListener) iterator.next();
         
        String _profileKey="preResultListener: ";
        try {
          UtilTimerStack.push(_profileKey);
          listener.beforeResult(this, resultCode);
        }
        finally {
          UtilTimerStack.pop(_profileKey);
        }
       }
      }

      // now execute the result, if we're supposed to
            // action与interceptor执行完毕,执行Result
      if (proxy.getExecuteResult()) {
       executeResult();
      }

      executed = true;
     }

     return resultCode;
    }
    finally {
     UtilTimerStack.pop(profileKey);
    }
}



从源码中,我们可以看到,我们之前提到的Struts2的Action层的4个不同的层次,在这个方法中都有体现,他们分别是:拦截器(Interceptor)、Action、PreResultListener和Result。在这个方法中,保证了这些层次的有序调用和执行。由此我们也可以看出Struts2在Action层次设计上的众多考虑,每个层次都具备了高度的扩展性和插入点,使得程序员可以在任何喜欢的层次加入自己的实现机制改变Action的行为。

在这里,需要特别强调的,是其中拦截器部分的执行调用:

resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);  


表面上,它只是执行了拦截器中的intercept方法,如果我们结合拦截器来看,就能看出点端倪来:

public String intercept(ActionInvocation invocation) throws Exception {    
    String result = null;    
   
        before(invocation);    
        // 调用invocation的invoke()方法,在这里形成了递归调用    
        result = invocation.invoke();    
        after(invocation, result);    
   
        return result;    
}  


原来在intercept()方法又对ActionInvocation的invoke()方法进行递归调用,ActionInvocation循环嵌套在intercept()中,一直到语句result = invocation.invoke()执行结束。这样,Interceptor又会按照刚开始执行的逆向顺序依次执行结束。
分享到:
评论

相关推荐

    Struts2拦截器原理分析

    在文章"Struts2拦截器原理分析实例"中,作者通过一个具体的应用场景,展示了如何配置和使用拦截器来实现特定的功能,比如日志记录或权限验证。通过阅读这篇博客,我们可以更直观地理解拦截器的工作方式和价值。 ...

    struts2拦截器原理

    Struts2 拦截器是基于Java的Servlet Filter设计模式的一种实现,它提供了一种在Action执行前后插入额外逻辑的方式。拦截器是Struts2框架的核心组件之一,用于增强应用的功能,比如权限验证、日志记录、数据校验等。 ...

    仿struts 2 拦截器原理

    仿struts 2 拦截器原理

    浅谈Struts2拦截器的原理与实现.docx

    以下是对Struts2拦截器原理与实现的详细解析: 1. **拦截器的概念** Struts2拦截器是一种AOP(面向切面编程)的实现,它可以在不修改Action代码的情况下,通过定义拦截器并在配置文件中设置拦截器链,来动态地添加...

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

    这篇文章将深入探讨Struts2拦截器的概念、工作原理以及如何在实际应用中使用它们。 **一、什么是Struts2拦截器** 拦截器是基于AOP(面向切面编程)思想的组件,它可以理解为在Action调用前后插入的逻辑处理。在...

    Struts拦截器及token拦截器防止重复提交例子源码

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

    Struts2的拦截器的小例子程序

    ### Struts2拦截器原理与实战案例解析 #### 一、Struts2拦截器概述 Struts2框架作为Java Web开发中的重要工具之一,其核心优势在于强大的MVC架构支持和丰富的扩展性。其中,拦截器(Interceptor)是Struts2框架的...

    struts2 拦截器

    下面将详细探讨Struts2拦截器及其工作原理。 ### 一、Struts2 拦截器概念 1. **拦截器是什么**:拦截器是一种动态拦截Action调用的对象,它可以理解为一个过滤器,它在Action被调用之前和之后执行特定的逻辑。...

    struts2 拦截器实例

    通过这两个实例,你将更深入地理解Struts2拦截器的工作原理和配置方式,以及它们如何在实际项目中发挥作用。记得在实践中多尝试,理解拦截器如何与其他Struts2组件协作,以提升你的Web应用开发技能。

    详解Struts2拦截器

    本文将深入探讨Struts2拦截器的基本概念、工作原理以及其实现机制,并结合实际应用场景来展示如何利用拦截器提高代码的复用性与可维护性。 #### 二、拦截器的概念与作用 拦截器(Interceptor)是一种设计模式,...

    struts2拦截器

    在Struts2中,拦截器的工作原理如下: 1. 用户发起HTTP请求,请求到达Struts2的Front Controller(DispatcherServlet)。 2. DispatcherServlet会根据配置找到对应的Action(动作)类。 3. 在调用Action之前,...

    Struts2拦截器实现权限控制demo

    首先,我们需要了解Struts2中的拦截器工作原理。拦截器是基于Java的动态代理模式实现的,它们按照配置的顺序在Action执行之前和之后执行。通过实现`Interceptor`接口或继承`AbstractInterceptor`类,我们可以创建...

    struts2拦截器的使用方法

    #### 二、Struts2拦截器的工作原理 拦截器的工作原理是基于责任链模式。当用户发起一个请求时,这个请求会经过一系列拦截器的处理,这些拦截器构成了一个责任链。每个拦截器都有机会处理请求或继续传递请求到下一个...

    struts2拦截器应用小例子

    首先,我们需要理解Struts2拦截器的工作原理。拦截器是一个实现了`Interceptor`接口的Java类,它们按照指定的顺序组成一个拦截器栈。当请求到达控制器时,Struts2会依次调用这个栈中的拦截器,每个拦截器都有机会...

    Struts2拦截器源程序

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

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

    首先,我们需要了解Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)思想实现的,它通过在Action调用前后插入额外的操作,形成一个拦截链。当一个请求到来时,Struts2会按照配置的顺序依次执行这些拦截器...

    Struts2拦截器源码

    下面将详细探讨Struts2拦截器的源码及其工作原理。 首先,理解拦截器的定义:拦截器是AOP(面向切面编程)的一个概念,在Struts2中,拦截器是基于Java的动态代理机制实现的。它们是一系列实现了`Interceptor`接口的...

    使用struts2拦截器对登陆权限验证

    首先,让我们理解Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)的概念设计的,它们形成一个链,每个拦截器按照定义的顺序依次执行。当请求到达Action时,Struts2会调用这个链上的所有拦截器,然后才...

    Struts2学习案例(拦截器)

    在本学习案例中,重点在于Struts2的拦截器(Interceptor)功能,这是Struts2的核心特性之一,它允许开发者在Action执行前后进行自定义处理,实现了灵活的业务逻辑控制和增强的功能。 首先,我们来理解一下什么是...

Global site tag (gtag.js) - Google Analytics