• 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不执行。

  • 相关阅读:
    nginx uwsgi django
    ubuntu config proxy
    jdbc调用sparksql
    jdbc调用sparksql on yarn
    JDK错误
    JDK错误
    docker错误
    docker错误
    Django网站直接使用supervisor部署
    Django网站直接使用supervisor部署
  • 原文地址:https://www.cnblogs.com/moxiaotao/p/9663351.html
Copyright © 2020-2023  润新知