一.定义

Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。

二.拦截器定义

实现HandlerInterceptor接口,如下:

package com.ssm.interceptor;

import org.omg.PortableInterceptor.Interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* Description:测试拦截器1
* User: jiatp
* Date: 2019/9/11 0011 下午 4:10
*/
public class HandlerInterceptor1 implements HandlerInterceptor {
/*
*进入handler方法之前执行,用于身份验证,身份授权
*如果身份认证没有通过则拦截住不让执行
*true:放行,false:拦截
*/
@Override
public boolean preHandle(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("HandlerInterceptor1...preHandle");
return true;
}
/*进入handler方法之后,返回modelandView之前执行
*应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图(菜单导航)
* */
@Override
public void postHandle(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("HandlerInterceptor1...postHandle"); }
/*
*handler执行完执行此方法,
* 应用场景:统一异常处理,日志处理等方法
* */
@Override
public void afterCompletion(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("HandlerInterceptor1...afterCompletion"); }
}

三.拦截器的配置

1.针对某种mapping配置拦截器

<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="handlerInterceptor1"/>
<ref bean="handlerInterceptor2"/>
</list>
</property>
</bean>
<bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/>
<bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>

2.针对所有mapping配置全局拦截器


<!--拦截器 -->
<mvc:interceptors>
<!--多个拦截器,顺序执行 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcast.springmvc.filter.HandlerInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcast.springmvc.filter.HandlerInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>

四.测试

定义两个拦截器分别为:HandlerInterceptor1和HandlerInteptor2,每个拦截器的preHandler方法都返回true。

true:放行,false:拦截

执行测试:

HandlerInterceptor1..preHandle..

HandlerInterceptor2..preHandle..

HandlerInterceptor2..postHandle..

HandlerInterceptor1..postHandle..

HandlerInterceptor2..afterCompletion..

HandlerInterceptor1..afterCompletion..

五.中断流程测试

定义两个拦截器分别为:HandlerInterceptor1和HandlerInteptor2

运行流程

HandlerInterceptor1的preHandler方法返回false,HandlerInterceptor2返回true,运行流程如下:

HandlerInterceptor1..preHandle..

从日志看出第一个拦截器的preHandler方法返回false后第一个拦截器只执行了preHandler方法,其它两个方法没有执行,第二个拦截器的所有方法不执行,且controller也不执行了。

HandlerInterceptor1的preHandler方法返回true,HandlerInterceptor2返回false,运行流程如下:

HandlerInterceptor1..preHandle..

HandlerInterceptor2..preHandle..

HandlerInterceptor1..afterCompletion..

从日志看出第二个拦截器的preHandler方法返回false后第一个拦截器的postHandler没有执行,第二个拦截器的postHandler和afterCompletion没有执行,且controller也不执行了。

总结:

preHandle按拦截器定义顺序调用

postHandler按拦截器定义逆序调用

afterCompletion按拦截器定义逆序调用

postHandler在拦截器链内所有拦截器返成功调用

afterCompletion只有preHandle返回true才调用

持续补充中...

最新文章

  1. 【解决】SharePoint Foundation 2013 未显示搜索框
  2. 阿里云ecs Linux平台安装mongodb数据库
  3. cut用法
  4. pip install使用豆瓣源
  5. Android OpenGL 基础入门
  6. 为什么和其他语言相比C语言是快速的语言
  7. 编译Release版本小技巧
  8. 使用maven管理后,依然找不到需要的jar包
  9. 中美HTML5市场发展的简单对比
  10. 使用python读取word,写入execl
  11. 尝试dapper和postgresql
  12. vim替换tab到4空格
  13. About Swift
  14. 20165220实验二《Java面向对象程序设计》
  15. 当通过Nuget包管理器获取还原组时,出现 提示 “xxxxx”已拥有为“xxxxx”定义的依赖项
  16. linux下tomcat启动没有日志,没有进程,没有报错,没有监听端口
  17. ZOJ 3965 Binary Tree Restoring
  18. Java 7-Java 循环结构 - for, while 及 do…while
  19. CentOS下安装robot-framework
  20. win2008安装IIS

热门文章

  1. 泛型(Generic)接口
  2. 使用VC6.0编译C++代码的时候报错:fatal error C1071: unexpected end of file found in comment(Mark ZZ)
  3. Delphi全面控制Windows任务栏
  4. centos6|centos7防火墙区别 | 网络配置区别
  5. 4 丑数 Ⅱ-找出第n个丑数
  6. 高手总结CSS书写技巧
  7. Nginx+win10安装配置
  8. Web UI 设计(网页设计)命名规范
  9. vue echart例——柱状图及高度自适应
  10. digitalpersona 开发(系统托盘,监听指纹扫描)