SpringMVC自定义多个拦截器执行顺序
一、正常流程下的拦截器(全部放行)
1.springMVC中拦截器实现这个接口HandlerInterceptor
第一个拦截器 HandlerInterceptor1
- public class HandlerInterceptor1 implements HandlerInterceptor {
- //进入 Handler方法之前执行
- //用于身份认证、身份授权
- //比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
- @Override
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- System.out.println("HandlerInterceptor1...preHandle");
- //return false表示拦截,不向下执行
- //return true表示放行
- return true;
- }
- //进入Handler方法之后,返回modelAndView之前执行
- //应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
- @Override
- public void postHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler,
- ModelAndView modelAndView) throws Exception {
- System.out.println("HandlerInterceptor1...postHandle");
- }
- //执行Handler完成执行此方法
- //应用场景:统一异常处理,统一日志处理
- @Override
- public void afterCompletion(HttpServletRequest request,
- HttpServletResponse response, Object handler, Exception ex)
- throws Exception {
- System.out.println("HandlerInterceptor1...afterCompletion");
- }
- }
第二个拦截器 HandlerInterceptor2
- public class HandlerInterceptor2 implements HandlerInterceptor {
- //进入 Handler方法之前执行
- //用于身份认证、身份授权
- //比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
- @Override
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- System.out.println("HandlerInterceptor2...preHandle");
- //return false表示拦截,不向下执行
- //return true表示放行
- return true;
- }
- //进入Handler方法之后,返回modelAndView之前执行
- //应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
- @Override
- public void postHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler,
- ModelAndView modelAndView) throws Exception {
- System.out.println("HandlerInterceptor2...postHandle");
- }
- //执行Handler完成执行此方法
- //应用场景:统一异常处理,统一日志处理
- @Override
- public void afterCompletion(HttpServletRequest request,
- HttpServletResponse response, Object handler, Exception ex)
- throws Exception {
- System.out.println("HandlerInterceptor2...afterCompletion");
- }
- }
springMVC.xml中配置两个拦截器
- <!--拦截器 -->
- <mvc:interceptors>
- <!--多个拦截器,顺序执行 -->
- <mvc:interceptor>
- <!-- /**表示所有url包括子url路径 -->
- <mvc:mapping path="/**"/>
- <bean class="cn.itcast.ssm.interceptor.HandlerInterceptor1"></bean>
- </mvc:interceptor>
- <mvc:interceptor>
- <mvc:mapping path="/**"/>
- <bean class="cn.itcast.ssm.interceptor.HandlerInterceptor2"></bean>
- </mvc:interceptor>
- </mvc:interceptors>
查看打印的日志信息
HandlerInterceptor1...preHandle
HandlerInterceptor2...preHandle
HandlerInterceptor2...postHandle
HandlerInterceptor1...postHandle
HandlerInterceptor2...afterCompletion
HandlerInterceptor1...afterCompletion
这是正常的拦截器执行流程
以上执行的拦截器是正常流程的拦截器的顺序
二、非正常情况下的拦截器(第一个拦截器放行,第二个拦截器拦截)
细心的读者会发现在拦截器中preHandle方法中的返回值我做了注解, //return false表示拦截,不向下执行//return true表示放行
- public class HandlerInterceptor2 implements HandlerInterceptor {
- //进入 Handler方法之前执行
- //用于身份认证、身份授权
- //比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
- @Override
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- System.out.println("HandlerInterceptor1...preHandle");
- //return false表示拦截,不向下执行
- //return true表示放行
- return false;
- }
再次启动系统拦截器的执行顺序
日志打印
HandlerInterceptor1...preHandle
HandlerInterceptor2...preHandle
HandlerInterceptor1...afterCompletion
总结:
拦截器1放行,拦截器2 preHandle才会执行。
拦截器2 preHandle不放行,拦截器2 postHandle和afterCompletion不会执行。
只要有一个拦截器不放行,postHandle不会执行。
二、非正常情况下的拦截器(第一个拦截器拦截,第二个拦截器拦截)
- public class HandlerInterceptor1 implements HandlerInterceptor {
- //进入 Handler方法之前执行
- //用于身份认证、身份授权
- //比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
- @Override
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- System.out.println("HandlerInterceptor1...preHandle");
- //return false表示拦截,不向下执行
- //return true表示放行
- return false;
- }
- public class HandlerInterceptor2 implements HandlerInterceptor {
- //进入 Handler方法之前执行
- //用于身份认证、身份授权
- //比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
- @Override
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- System.out.println("HandlerInterceptor2...preHandle");
- //return false表示拦截,不向下执行
- //return true表示放行
- return false;
- }
日志打印
HandlerInterceptor1...preHandle
总结
拦截器1 preHandle不放行,postHandle和afterCompletion不会执行。
拦截器1 preHandle不放行,拦截器2不执行。
SpringMVC自定义多个拦截器执行顺序的更多相关文章
- Struts2的默认拦截器执行顺序
我们在写Struts2的时候package属性默认都是差不多这样吧 <package name="packageName" namespace="/" e ...
- Springmvc的拦截器执行顺序及各方法作用
实现HandlerInterceptor接口或者继承HandlerInterceptor的子类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInt ...
- SpringMVC学习笔记九:拦截器及拦截器的简单实用
SpringMVC中的interceptor拦截器是非常重要的,它的主要作用就是拦截指定的用户请求,并进行相应的预处理和后处理. 拦截时间点在"处理器映射器根据用户提交的请求映射出所要执行的 ...
- SpringMVC中使用Interceptor拦截器顺序
一.简介 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验 证,或者是来判断用户是否登陆,或者是像1 ...
- SpringMVC拦截器执行流程
1:MyInterceptor1.MyInterceptor2这2个拦截器都放行 MyInterceptor1......preHandleMyInterceptor2......preHandle ...
- SpringMVC框架下的拦截器
在eclipse的javaEE环境下:导包.... web.xml文件中的配置: <?xml version="1.0" encoding="UTF-8" ...
- SpringMVC总结四:拦截器简单介绍
首先要说一下HandlerExecutionChain: HandlerExecutionChain是一个执行链,当用户的请求到达DispatcherServlet的时候,DispatcherServ ...
- SpringMVC中session使用&&拦截器&&乱码处理&&异常处理
### 1. 使用Session 通常,会在Session中存放: 1. 客户端(用户)的身份标识,通常是用户的id:2. 使用频率非常高的数据,例如显示在页面中的用户名.头像等:3. 其它的不便于使 ...
- SpringMVC 学习笔记(六)拦截器
5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...
随机推荐
- 如何使用EditPlus将json格式字符串默认为UTF-8格式
1.首先用EditPlus打开json格式的文件 2.选择Tools工具栏下的Configure User Tools 3.点击左侧File 4.在右侧Default encoding中选择UTF- ...
- getUserMedia API
getUserMedia API 特别有趣的一个 API,能够调用电脑的摄像头,未来这个 API 将被广泛用来让浏览器和用户之间互动. 如果 <video> 标签和 Canvas 现结合 ...
- boost::python开发环境搭建
本来想用mingw编译boost::python模块,网上看了下资料太少,只有使用vs2012 操作环境:win7 x64 python: x86 boost: 1.57 编译boost::pytho ...
- java 抽象方法
int 是基本数据类型Integer是其包装类,注意是一个类.为什么要提供包装类呢???一是为了在各种类型间转化,通过各种方法的调用.否则 你无法直接通过变量转化.比如,现在int要转为Stringi ...
- 设置datalist指定行的背景色
前台: <div class="table-responsive" > <table class="table table-bordered table ...
- 转【C#调用DLL的几种方法,包括C#调用C\C++\C#DLL】
C#中dll调用方法 一. DLL与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一, ...
- JavaWeb中MVC的使用--以管理系统举例
开发环境:JavaSE1.7.JavaEE7.0.JSTL1.2.2.Web2.3.MySQL5.5.28 系统分析与功能设计: 本系统实现商品信息的管理,应包括以下几个功能: 商品信息列表:列出所有 ...
- EXTJs前后台交互 常用哦3种方式
<1>Ajax交互方式 Ext.Ajax.request( { //被用来向服务器发起请求默认的url url : "", //请求时发送后台的参数,既可以是Json对 ...
- RouteSelector的初始化
继前面的几篇OKhttp的拦截器简单分析之后,对于后续Okhttp之间的分析自己也着实琢磨了一段时间,是分析RealConnection?还是ConnectionPool,随着对Okhttp源码的深入 ...
- luogu3327 [SDOI2015]约数个数和
link 设\(d(x)\)表示x约数个数,给定n,m,\(\sum_{i=1}^n\sum_{j=1}^md(ij)\) 多组询问,1<=T<=50000,1<=N, M<= ...