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,用于对处理器进行预处理和后处理. ...
随机推荐
- 关于pdf阅读器的选择
如果只是想简单阅读不做学习笔记.标注之类的 可以直接用chrome firefox打开,它们内部有一个pdf.js实现了pdf标准可以直接阅读. 如果是要批注pdf,就和在纸质书上做笔记.添加书签,那 ...
- Linux expect命令
一.简介 通过Shell可以实现简单的控制流功能,但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能.而就使用来实现这种功能的工具.Ex ...
- 1003 NOIP 模拟赛Day2 城市建设
题面不好找放一个吧. Description 描述 在有$N$个地级市的H省,政府为了城市开发建设,决定先修路,后造房子,以吸引外来人员.一开始每个城市中有$b_i$个住户,而在两个城市$u,v$之间 ...
- boost::python的使用
boost::python库是pyhon和c++相互交互的框架,可以再python中调用c++的类和方法,也可以让c++调用python的类和方法 python自身提供了一个Python/C AP ...
- idea中解决Error:java: Compilation failed: internal java compiler error的问题
项目中,使用gradle做项目构建,当我们想更改JDK的版本时,报以下错误: Information:Using javac 1.8.0_111 to compile java sourcesInfo ...
- C语言结构体--位域
有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可.比如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位.正是基于这种考虑,C语言又提供了一种叫做位域 ...
- ubuntu - 14.04,安装Go语言(谷歌公司开发的一种语言)
Go语言下载地址:https://storage.googleapis.com/golang/go1.5.1.linux-amd64.tar.gz 安装: 1,以root身份在shell里执行: ta ...
- I - 一次元リバーシ / 1D Reversi(水题)
Problem Statement Two foxes Jiro and Saburo are playing a game called 1D Reversi. This game is playe ...
- vue框架搭建的详细步骤(一)
在这里我们先快速的搭建一个vue的脚手架: (1).在安装vue的环境之前,安装NodeJS环境是必须的.可以使用node -v指令检查,需要保证安装了4.0版本以上的nodeJS环境. 没有安装的话 ...
- 洛谷P5206 [WC2019] 数树(生成函数+容斥+矩阵树)
题面 传送门 前置芝士 矩阵树,基本容斥原理,生成函数,多项式\(\exp\) 题解 我也想哭了--orz rqy,orz shadowice 我们设\(T1,T2\)为两棵树,并定义一个权值函数\( ...