zoukankan      html  css  js  c++  java
  • SpringMVC自定义多个拦截器执行顺序

    一、正常流程下的拦截器(全部放行)

    1.springMVC中拦截器实现这个接口HandlerInterceptor

    第一个拦截器 HandlerInterceptor1

    1.  
      public class HandlerInterceptor1 implements HandlerInterceptor {
    2.  
      //进入 Handler方法之前执行
    3.  
      //用于身份认证、身份授权
    4.  
      //比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
    5.  
      @Override
    6.  
      public boolean preHandle(HttpServletRequest request,
    7.  
      HttpServletResponse response, Object handler) throws Exception {
    8.  
      System.out.println("HandlerInterceptor1...preHandle");
    9.  
      //return false表示拦截,不向下执行
    10.  
      //return true表示放行
    11.  
      return true;
    12.  
      }
    13.  
      //进入Handler方法之后,返回modelAndView之前执行
    14.  
      //应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
    15.  
      @Override
    16.  
      public void postHandle(HttpServletRequest request,
    17.  
      HttpServletResponse response, Object handler,
    18.  
      ModelAndView modelAndView) throws Exception {
    19.  
      System.out.println("HandlerInterceptor1...postHandle");
    20.  
      }
    21.  
      //执行Handler完成执行此方法
    22.  
      //应用场景:统一异常处理,统一日志处理
    23.  
      @Override
    24.  
      public void afterCompletion(HttpServletRequest request,
    25.  
      HttpServletResponse response, Object handler, Exception ex)
    26.  
      throws Exception {
    27.  
      System.out.println("HandlerInterceptor1...afterCompletion");
    28.  
      }
    29.  
      }

    第二个拦截器 HandlerInterceptor2

    1.  
      public class HandlerInterceptor2 implements HandlerInterceptor {
    2.  
      //进入 Handler方法之前执行
    3.  
      //用于身份认证、身份授权
    4.  
      //比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
    5.  
      @Override
    6.  
      public boolean preHandle(HttpServletRequest request,
    7.  
      HttpServletResponse response, Object handler) throws Exception {
    8.  
      System.out.println("HandlerInterceptor2...preHandle");
    9.  
      //return false表示拦截,不向下执行
    10.  
      //return true表示放行
    11.  
      return true;
    12.  
      }
    13.  
      //进入Handler方法之后,返回modelAndView之前执行
    14.  
      //应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
    15.  
      @Override
    16.  
      public void postHandle(HttpServletRequest request,
    17.  
      HttpServletResponse response, Object handler,
    18.  
      ModelAndView modelAndView) throws Exception {
    19.  
      System.out.println("HandlerInterceptor2...postHandle");
    20.  
      }
    21.  
      //执行Handler完成执行此方法
    22.  
      //应用场景:统一异常处理,统一日志处理
    23.  
      @Override
    24.  
      public void afterCompletion(HttpServletRequest request,
    25.  
      HttpServletResponse response, Object handler, Exception ex)
    26.  
      throws Exception {
    27.  
      System.out.println("HandlerInterceptor2...afterCompletion");
    28.  
      }
    29.  
      }

    springMVC.xml中配置两个拦截器

    1.  
      <!--拦截器 -->
    2.  
      <mvc:interceptors>
    3.  
      <!--多个拦截器,顺序执行 -->
    4.  
      <mvc:interceptor>
    5.  
      <!-- /**表示所有url包括子url路径 -->
    6.  
      <mvc:mapping path="/**"/>
    7.  
      <bean class="cn.itcast.ssm.interceptor.HandlerInterceptor1"></bean>
    8.  
      </mvc:interceptor>
    9.  
      <mvc:interceptor>
    10.  
      <mvc:mapping path="/**"/>
    11.  
      <bean class="cn.itcast.ssm.interceptor.HandlerInterceptor2"></bean>
    12.  
      </mvc:interceptor>
    13.  
      </mvc:interceptors>

    查看打印的日志信息


    HandlerInterceptor1...preHandle
    HandlerInterceptor2...preHandle

    HandlerInterceptor2...postHandle
    HandlerInterceptor1...postHandle

    HandlerInterceptor2...afterCompletion
    HandlerInterceptor1...afterCompletion

    这是正常的拦截器执行流程

    以上执行的拦截器是正常流程的拦截器的顺序

    二、非正常情况下的拦截器(第一个拦截器放行,第二个拦截器拦截)

          细心的读者会发现在拦截器中preHandle方法中的返回值我做了注解,  //return false表示拦截,不向下执行//return true表示放行

    1.  
      public class HandlerInterceptor2 implements HandlerInterceptor {
    2.  
      //进入 Handler方法之前执行
    3.  
      //用于身份认证、身份授权
    4.  
      //比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
    5.  
      @Override
    6.  
      public boolean preHandle(HttpServletRequest request,
    7.  
      HttpServletResponse response, Object handler) throws Exception {
    8.  
      System.out.println("HandlerInterceptor1...preHandle");
    9.  
      //return false表示拦截,不向下执行
    10.  
      //return true表示放行
    11.  
      return false;
    12.  
      }

    再次启动系统拦截器的执行顺序

    日志打印

    HandlerInterceptor1...preHandle
    HandlerInterceptor2...preHandle
    HandlerInterceptor1...afterCompletion

    总结:

    拦截器1放行,拦截器2 preHandle才会执行。

    拦截器2 preHandle不放行,拦截器2 postHandle和afterCompletion不会执行。

    只要有一个拦截器不放行,postHandle不会执行。

    二、非正常情况下的拦截器(第一个拦截器拦截,第二个拦截器拦截)

    1.  
      public class HandlerInterceptor1 implements HandlerInterceptor {
    2.  
      //进入 Handler方法之前执行
    3.  
      //用于身份认证、身份授权
    4.  
      //比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
    5.  
      @Override
    6.  
      public boolean preHandle(HttpServletRequest request,
    7.  
      HttpServletResponse response, Object handler) throws Exception {
    8.  
      System.out.println("HandlerInterceptor1...preHandle");
    9.  
      //return false表示拦截,不向下执行
    10.  
      //return true表示放行
    11.  
      return false;
    12.  
      }
    1.  
      public class HandlerInterceptor2 implements HandlerInterceptor {
    2.  
      //进入 Handler方法之前执行
    3.  
      //用于身份认证、身份授权
    4.  
      //比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
    5.  
      @Override
    6.  
      public boolean preHandle(HttpServletRequest request,
    7.  
      HttpServletResponse response, Object handler) throws Exception {
    8.  
      System.out.println("HandlerInterceptor2...preHandle");
    9.  
      //return false表示拦截,不向下执行
    10.  
      //return true表示放行
    11.  
      return false;
    12.  
      }

    日志打印

    HandlerInterceptor1...preHandle

    总结

    拦截器1 preHandle不放行,postHandle和afterCompletion不会执行。

    拦截器1 preHandle不放行,拦截器2不执行。

  • 相关阅读:
    numpy百题冲关,pandas百题冲关
    mapreduce过程以及相关类总结
    mapreduce,数据结构和类型介绍
    精确度、召回率、混淆矩阵的关系
    小程序点击图片放大效果 单张图片 多张图片
    小程序动态添加class及调接口传递多个参数
    小程序for循环嵌套
    小程序富文本转换
    jquery函数加载及生成随机数
    微信小程序 swiper 显示图片计数 当前/总数
  • 原文地址:https://www.cnblogs.com/moxiaotao/p/9663351.html
Copyright © 2011-2022 走看看