zoukankan      html  css  js  c++  java
  • SpringMVC多拦截器的执行

    如果有多个拦截器,执行的顺序是在SpringMVC的配置文件里的前后顺序。

    <mvc:interceptors>
      <bean class="com.neuedu.interceptor.Inteceptor1"></bean>
      <mvc:interceptor>
        <mvc:mapping path="/test"/>
        <bean class="com.neuedu.interceptor.Inteceptor2"></bean>
      </mvc:interceptor>
    </mvc:interceptors>

    第一个拦截器在前面就先执行第一个拦截器的preHandle方法。

    第一个拦截器

    package com.neuedu.interceptor;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    public class Inteceptor1 implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            // TODO Auto-generated method stub
            System.out.println("first-preHandle");
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                ModelAndView modelAndView) throws Exception {
            System.out.println("first-postHandle");
            
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
            System.out.println("first-afterCompletion");
            
        }
    
    }

    这样第二个拦截器:

    package com.neuedu.interceptor;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    public class Inteceptor2 implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            // TODO Auto-generated method stub
            System.out.println("second-preHandle");
            return false;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                ModelAndView modelAndView) throws Exception {
            System.out.println("second-postHandle");
            
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
            System.out.println("second-afterCompletion");
            
        }
    
    }

    请求的方法:

    @Controller
    public class BController {
        @RequestMapping(value="/test")
        public void test(){
    //        
            System.out.println("目标方法执行");
            
            
        }
    }

    执行的结果:

    first-preHandle
    second-preHandle
    目标方法执行
    second-postHandle
    first-postHandle
    second-afterCompletion
    first-afterCompletion

    结果说明多拦截器的顺序是:

     先执行第一拦截器的preHandle

    然后第二个拦截器的preHandle

    目标方法的方法

    第二个拦截器的postHandle

    第一个拦截器的postHandle

    第二个拦截器的afterCompletion

    第一个拦截器的afterCompletion

  • 相关阅读:
    第 15 章 标签页和工具提示插件
    第 14 章 下拉菜单和滚动监听插件
    第 13 章 模态框插件
    第 12 章 列表组面板和嵌入组件
    第 11 章 进度条媒体对象和 Well 组件
    第 10 章 巨幕页头缩略图和警告框组件
    第 9 章 路径分页标签和徽章组件
    lock()与lockInterruptibly()的区别
    MySQL中Innodb的聚簇索引和非聚簇索引
    MySQL使用可重复读作为默认隔离级别的原因
  • 原文地址:https://www.cnblogs.com/xuesheng/p/7425874.html
Copyright © 2011-2022 走看看