JAVA拦截器(Interceptor)实现以及原码示例
JAVA拦截器(Interceptor)实现以及原码示例
- 概念
- SpringMVC中拦截器【interceptor】
- 一、实现拦截器代码
- 二、单/多 个拦截器运行
- 1.单个拦截器
- 2.多个拦截器
- 源码解析
- 拦截器中preHandle()方法 return false时的工作原理
概念
逐步分析原码示例
SpringMVC中拦截器【interceptor】
一、过滤器【Filter】与拦截器【Interceptor】区别
1、过滤器属于web组件,拦截器属于SpringMVC核心组件。
2、过滤器执行Servlet之前执行,拦截器执行Servlet【DispatcherServlet】之后且执行Cotroller【请求处理器】之前【之后】分别执行。
二、实现拦截器两种方式
1、直接实现HandlerInterceptor接口
2、直接继承handlerinterceptorAdapter适配器类
文章目录
- 概念
- SpringMVC中拦截器【interceptor】
- 一、实现拦截器代码
- 二、单/多 个拦截器运行
- 1.单个拦截器
- 2.多个拦截器
- 源码解析
- 拦截器中preHandle()方法 return false时的工作原理
一、实现拦截器代码
1、装配【SpringMVC.xml】
<!-- 装配拦截器--><mvc:interceptors>
<!-- 为所有Controller装配拦截器 全局方式一:-->
<!-- <bean id="myInterceptor" class="com.packname.interceptor.MyInterceptor"></bean>-->
<!-- 全局方式二:--><ref bean="myInterceptor"></ref>
<!-- 为局部Controller装配拦截器-->
<!-- <mvc:interceptor >-->
<!-- <mvc:mapping path="/"/>--> 选择需要拦截的控制器
<!-- <mvc:exclude-mapping path="/"/>--> 排除不需要拦截的控制器
<!-- <bean class="com"></bean>--> 拦截器对象
<!-- </mvc:interceptor>--></mvc:interceptors>
2、java代码实现定义拦截器
@Component("myInterceptor")
public class MyInterceptor extends HandlerInterceptorAdapter {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("1. 首先执行此方法");return true; //此方法若为false,则运行结束,后续选择控制器停止运行}//顺序第二的为选择控制器public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {System.out.println("3.顺序第三");}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {System.out.println("4.顺序第四");}
}
二、单/多 个拦截器运行
1.单个拦截器
*请求指定Controller的url
*preHandle():处理请求之前的业务,return true时!
*执行Controller的url
*postHandle():处理响应之前的业务
*视图渲染【通过视图解析出现视图对象,视图对象将数据存放到域中,并跳转路径】
*afterCompletion:处理完所有业务之后执行【释放资源等】
2.多个拦截器
测试准备:创建两个拦截器,实现或者继承,重写方法,jsp页面使其访问同一选择控制器的url*请求指定Controller的url
*拦截器1的preHandle():处理请求之前的业务,return true时
*拦截器2的preHandle():处理请求之前的业务,return true时
- 执行Controller的url
- 拦截器2postHandle():处理响应之前业务
- 拦截器1postHandle():处理响应之前业务
- 视图渲染【通过视图解析器解析出视图对象,视图对象将数据存放到域中,并跳转路径】
- 拦截器2的afterCompletion():处理外所有业务之后执行【释放资源等】
- 拦截器1的afterCompletion():处理外所有业务之后执行【释放资源等】
源码解析
boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {HandlerInterceptor[] interceptors = this.getInterceptors();if (!ObjectUtils.isEmpty(interceptors)) {for(int i = 0; i < interceptors.length; this.interceptorIndex = i++) {HandlerInterceptor interceptor = interceptors[i];if (!interceptor.preHandle(request, response, this.handler)) {this.triggerAfterCompletion(request, response, (Exception)null);return false;}}}return true;
}
void applyPostHandle(HttpServletRequest request, HttpServletResponse response, @Nullable ModelAndView mv) throws Exception {HandlerInterceptor[] interceptors = this.getInterceptors();if (!ObjectUtils.isEmpty(interceptors)) {for(int i = interceptors.length - 1; i >= 0; --i) {HandlerInterceptor interceptor = interceptors[i];interceptor.postHandle(request, response, this.handler, mv);}}}void triggerAfterCompletion(HttpServletRequest request, HttpServletResponse response, @Nullable Exception ex) throws Exception {HandlerInterceptor[] interceptors = this.getInterceptors();if (!ObjectUtils.isEmpty(interceptors)) {for(int i = this.interceptorIndex; i >= 0; --i) {HandlerInterceptor interceptor = interceptors[i];try {interceptor.afterCompletion(request, response, this.handler, ex);} catch (Throwable var8) {logger.error("HandlerInterceptor.afterCompletion threw exception", var8);}}}}
拦截器中preHandle()方法 return false时的工作原理
-第一个拦截器的preHandle()方法 return false时的工作原理
只执行第一个拦截器的preHandle(),后续代码均未执行。
源码:
//DispatcherServlet 的499行代码
if (!mappedHandler.applyPreHandle(processedRequest, response)) {return;
}
非第一个拦截器的preHandle()方法return false时的工作原理
-执行两处代码执行当前拦截器【prehandler】 return false的拦截器的preHandle()方法均会执行执行之前拦截器的afterCompletion()方法
转载请注明
JAVA拦截器(Interceptor)实现以及原码示例相关推荐
- Flume-NG源码阅读之SourceRunner,及选择器selector和拦截器interceptor的执行
在AbstractConfigurationProvider类中loadSources方法会将所有的source进行封装成SourceRunner放到了Map<String, SourceRun ...
- 用 Java 实现拦截器 Interceptor 的拦截功能
Java 里的拦截器是动态拦截 action 调用的对象,它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也可以在一个 action 执行前阻止其执行,同时也提供了一种 ...
- (十六)ATP应用测试平台——java应用中的过滤器Filter、拦截器Interceptor、参数解析器Resolver、Aop切面,你会了吗?
前言 过滤器Filter.拦截器Interceptor.参数解析器Resolver.Aop切面是我们应用开发中经常使用到的技术,到底该如何使用这些web附属功能, 本小节我们就分别介绍一下其各自的用法 ...
- JAVA incept_java 过滤器(Filter)与springMVC 拦截器(interceptor)的实现案例
java 过滤器Filter: package com.sun.test.aircraft.filter; import javax.servlet.*; import java.io.IOExcep ...
- springboot中的拦截器interceptor和过滤器filter,多次获取request参数
大家好,我是烤鸭: 这是一篇关于springboot的拦截器(interceptor)和过滤器(Filter). 先说一下过滤器和拦截器. 区别: 1. servlet请求,顺序:Filter ...
- OKHttp拦截器(Interceptor)
一.拦截器一般作用 <1> URL重定向. <2> 请求体数据加密. <3> HEAD动态添加. <4> 请求日志抓取. 二.基础讲解 <1> ...
- spring过滤器Filter 、 拦截器Interceptor 、 切片Aspect 详解
springboot 过滤器Filter vs 拦截器Interceptor vs 切片Aspect 详解 1 前言 最近接触到了过滤器和拦截器,网上查了查资料,这里记录一下,这篇文章就来仔细剖析下过 ...
- Mybatis拦截器的使用及其源码详解
Mybatis拦截器的使用及其源码详解 Mybatis相关全览 一.简介 执行与添加顺序 拦截器生效入口 二.使用 例子 三.原理 加载入口 生成代理 遍历拦截器 匹配&生成代理 四.实践例子 ...
- 区分Java拦截器和过滤器
今天带大家分析java拦截器和过滤器的区别,文中有非常详细的解释说明,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下 一.过滤器(filter) 过滤器处于客户端与Web资源(Serv ...
最新文章
- msql每个数据前面添加某个字符串查询或者更新
- python获取登录按钮_python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈。
- c语言用链表的方式实现多项式加减,如何实现C语言单链表多项式相加的操作
- 一些java基本程序图解2
- 腾讯、Meta、鲁大师竞相登场,谁能开辟元宇宙社交新思路?
- java tcp发消息给硬件_java – TCP客户端/服务器通信只发送第一条消息?
- 注解配置声明式事务控制解析
- 图解分布式架构的演进过程!
- python中的 同步与异步 互斥锁 和 死锁
- 7.18 day13
- SparkStreaming与kafka的结合
- 投影仪开关机码和波特率
- 通过Callable和FutureTask创建线程
- Julia: Dict类型 与 Symbol
- Matlab DIP(瓦)ch5图像复原练习
- 自学网html视频教程,ps教程自学网html视频教程
- 语文招教考试-古今中外神话故事汇总,教育心理学知识点
- 画图软件origin-柱状图断点设置
- iPhone, iPad 安装 ipa 文件
- Python图书商城(可运行代码)有说明文档
热门文章
- 3D游戏编程与设计作业2-太阳系-Priests and Devils
- 游戏用简单像素画素材的绘制
- 360°全景影像数据流图和代码走读
- 一些在代码中踩过的坑,从来没遇到过的估计已经不是大头兵了。
- VLC播放器在Ubuntu-18.04上的安装
- 十分详细的数码管电子时钟(基于51单片机)
- 跨境电商选品避坑指南-成都扬帆凌远跨境电商
- 播放器音乐源之天天动听API
- HTML5七夕情人节表白网页_圣诞节3d相册(含音乐开关)_ HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册 js烟花代码
- 计算机对会计有什么好处,会计专业转行干过设计工作,这些宝贵经验和感悟,对你有用(三)...