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)实现以及原码示例相关推荐

  1. Flume-NG源码阅读之SourceRunner,及选择器selector和拦截器interceptor的执行

    在AbstractConfigurationProvider类中loadSources方法会将所有的source进行封装成SourceRunner放到了Map<String, SourceRun ...

  2. 用 Java 实现拦截器 Interceptor 的拦截功能

    Java 里的拦截器是动态拦截 action 调用的对象,它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也可以在一个 action 执行前阻止其执行,同时也提供了一种 ...

  3. (十六)ATP应用测试平台——java应用中的过滤器Filter、拦截器Interceptor、参数解析器Resolver、Aop切面,你会了吗?

    前言 过滤器Filter.拦截器Interceptor.参数解析器Resolver.Aop切面是我们应用开发中经常使用到的技术,到底该如何使用这些web附属功能, 本小节我们就分别介绍一下其各自的用法 ...

  4. JAVA incept_java 过滤器(Filter)与springMVC 拦截器(interceptor)的实现案例

    java 过滤器Filter: package com.sun.test.aircraft.filter; import javax.servlet.*; import java.io.IOExcep ...

  5. springboot中的拦截器interceptor和过滤器filter,多次获取request参数

    大家好,我是烤鸭:     这是一篇关于springboot的拦截器(interceptor)和过滤器(Filter). 先说一下过滤器和拦截器. 区别: 1. servlet请求,顺序:Filter ...

  6. OKHttp拦截器(Interceptor)

    一.拦截器一般作用 <1> URL重定向. <2> 请求体数据加密. <3> HEAD动态添加. <4> 请求日志抓取. 二.基础讲解 <1> ...

  7. spring过滤器Filter 、 拦截器Interceptor 、 切片Aspect 详解

    springboot 过滤器Filter vs 拦截器Interceptor vs 切片Aspect 详解 1 前言 最近接触到了过滤器和拦截器,网上查了查资料,这里记录一下,这篇文章就来仔细剖析下过 ...

  8. Mybatis拦截器的使用及其源码详解

    Mybatis拦截器的使用及其源码详解 Mybatis相关全览 一.简介 执行与添加顺序 拦截器生效入口 二.使用 例子 三.原理 加载入口 生成代理 遍历拦截器 匹配&生成代理 四.实践例子 ...

  9. 区分Java拦截器和过滤器

    今天带大家分析java拦截器和过滤器的区别,文中有非常详细的解释说明,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下 一.过滤器(filter) 过滤器处于客户端与Web资源(Serv ...

最新文章

  1. msql每个数据前面添加某个字符串查询或者更新
  2. python获取登录按钮_python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈。
  3. c语言用链表的方式实现多项式加减,如何实现C语言单链表多项式相加的操作
  4. 一些java基本程序图解2
  5. 腾讯、Meta、鲁大师竞相登场,谁能开辟元宇宙社交新思路?
  6. java tcp发消息给硬件_java – TCP客户端/服务器通信只发送第一条消息?
  7. 注解配置声明式事务控制解析
  8. 图解分布式架构的演进过程!
  9. python中的 同步与异步 互斥锁 和 死锁
  10. 7.18 day13
  11. SparkStreaming与kafka的结合
  12. 投影仪开关机码和波特率
  13. 通过Callable和FutureTask创建线程
  14. Julia: Dict类型 与 Symbol
  15. Matlab DIP(瓦)ch5图像复原练习
  16. 自学网html视频教程,ps教程自学网html视频教程
  17. 语文招教考试-古今中外神话故事汇总,教育心理学知识点
  18. 画图软件origin-柱状图断点设置
  19. iPhone, iPad 安装 ipa 文件
  20. Python图书商城(可运行代码)有说明文档

热门文章

  1. 3D游戏编程与设计作业2-太阳系-Priests and Devils
  2. 游戏用简单像素画素材的绘制
  3. 360°全景影像数据流图和代码走读
  4. 一些在代码中踩过的坑,从来没遇到过的估计已经不是大头兵了。
  5. VLC播放器在Ubuntu-18.04上的安装
  6. 十分详细的数码管电子时钟(基于51单片机)
  7. 跨境电商选品避坑指南-成都扬帆凌远跨境电商
  8. 播放器音乐源之天天动听API
  9. HTML5七夕情人节表白网页_圣诞节3d相册(含音乐开关)_ HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册 js烟花代码
  10. 计算机对会计有什么好处,会计专业转行干过设计工作,这些宝贵经验和感悟,对你有用(三)...