12_springmvc拦截器
一.定义
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才调用
持续补充中...
最新文章
- 【解决】SharePoint Foundation 2013 未显示搜索框
- 阿里云ecs Linux平台安装mongodb数据库
- cut用法
- pip install使用豆瓣源
- Android OpenGL 基础入门
- 为什么和其他语言相比C语言是快速的语言
- 编译Release版本小技巧
- 使用maven管理后,依然找不到需要的jar包
- 中美HTML5市场发展的简单对比
- 使用python读取word,写入execl
- 尝试dapper和postgresql
- vim替换tab到4空格
- About Swift
- 20165220实验二《Java面向对象程序设计》
- 当通过Nuget包管理器获取还原组时,出现 提示 “xxxxx”已拥有为“xxxxx”定义的依赖项
- linux下tomcat启动没有日志,没有进程,没有报错,没有监听端口
- ZOJ 3965 Binary Tree Restoring
- Java 7-Java 循环结构 - for, while 及 do…while
- CentOS下安装robot-framework
- win2008安装IIS
热门文章
- 泛型(Generic)接口
- 使用VC6.0编译C++代码的时候报错:fatal error C1071: unexpected end of file found in comment(Mark ZZ)
- Delphi全面控制Windows任务栏
- centos6|centos7防火墙区别 | 网络配置区别
- 4 丑数 Ⅱ-找出第n个丑数
- 高手总结CSS书写技巧
- Nginx+win10安装配置
- Web UI 设计(网页设计)命名规范
- vue echart例——柱状图及高度自适应
- digitalpersona 开发(系统托盘,监听指纹扫描)