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

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

SpringMVC自定义多个拦截器执行顺序的更多相关文章

  1. Struts2的默认拦截器执行顺序

    我们在写Struts2的时候package属性默认都是差不多这样吧 <package name="packageName" namespace="/" e ...

  2. Springmvc的拦截器执行顺序及各方法作用

    实现HandlerInterceptor接口或者继承HandlerInterceptor的子类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInt ...

  3. SpringMVC学习笔记九:拦截器及拦截器的简单实用

    SpringMVC中的interceptor拦截器是非常重要的,它的主要作用就是拦截指定的用户请求,并进行相应的预处理和后处理. 拦截时间点在"处理器映射器根据用户提交的请求映射出所要执行的 ...

  4. SpringMVC中使用Interceptor拦截器顺序

    一.简介 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验 证,或者是来判断用户是否登陆,或者是像1 ...

  5. SpringMVC拦截器执行流程

    1:MyInterceptor1.MyInterceptor2这2个拦截器都放行 MyInterceptor1......preHandleMyInterceptor2......preHandle ...

  6. SpringMVC框架下的拦截器

    在eclipse的javaEE环境下:导包.... web.xml文件中的配置: <?xml version="1.0" encoding="UTF-8" ...

  7. SpringMVC总结四:拦截器简单介绍

    首先要说一下HandlerExecutionChain: HandlerExecutionChain是一个执行链,当用户的请求到达DispatcherServlet的时候,DispatcherServ ...

  8. SpringMVC中session使用&&拦截器&&乱码处理&&异常处理

    ### 1. 使用Session 通常,会在Session中存放: 1. 客户端(用户)的身份标识,通常是用户的id:2. 使用频率非常高的数据,例如显示在页面中的用户名.头像等:3. 其它的不便于使 ...

  9. SpringMVC 学习笔记(六)拦截器

    5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...

随机推荐

  1. loj10100 网络

    这个题目描述好难理解呀qwq... 传送门 分析 在读懂题之后我们不难发现这道题实际就是在求一张图中有多少个割点.只需要注意读入方式即可. 代码 #include<iostream> #i ...

  2. Ubuntu jdk安装详细

    安装jdk步骤: 1.首先连接130的ip地址,进去Tools拷贝jdk压缩文件(Tools中已经有下载好的jdk版本,也可自己另行下载) 2.将拷贝好的压缩文件解压 tar -zxvf 压缩文件名 ...

  3. [译]Javascript中的mutators

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  4. Struts2 引入

    引入:   说:如果一个路径想访问一个类,需求怎么做? 第一种方法,用servlet 第二种方法,用过滤器 第三种方法如下图:把路径和方法都存到map里面,用反射可以执行类下的方法     第三中方法 ...

  5. Java50道经典习题-程序39 分数累加

    题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n import java.util.Scanner; public ...

  6. HTTP 协议 -- 浏览器缓存机制

    浏览器缓存机制 浏览器缓存机制主要是 HTTP 协议定义的缓存机制. HTTP 协议中有关缓存的缓存信息头的关键字有 Cache-Control,Pragma,Expires,Last-Modifie ...

  7. 在WinForm中使用Web Services 来实现 软件 自动升级( Auto Update ) (C#)

    winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个通过软件实现自动升级技术方案,弥补了 ...

  8. EXCEL跨表比较两列,并填充新值背景

    Sub FillNewToYellow() Dim dic Dim oldArr(), updatedArr() On Error Resume Next If Worksheets("ol ...

  9. JavaAppArguments示例

    本实验要求编写一个程序,此程序从命令行接收多个数字,求和之后输出结果.一大难点是命令行参数都是字符串,必须先将其转化为数字,才能相加. 中心想法就是将求和数字转换为整型并依次相加. 程序流程图: pu ...

  10. 快速莫比乌斯变换(FMT)

    快速莫比乌斯变换(FMT) 原文出处:虞大的博客.此仅作蒟蒻本人复习用~ 给定两个长度为n的序列 \(a_0, a_1, \cdots, a_{n-1}\)和\(b_0, b_1, \cdots, b ...