首页 > 编程语言 >Spring MVC 源码分析 - HandlerMapping 组件(二)之 HandlerInterceptor 拦截器

Spring MVC 源码分析 - HandlerMapping 组件(二)之 HandlerInterceptor 拦截器

时间:2023-12-22 14:03:22浏览次数:29  
标签:HandlerMapping 拦截器 interceptors public handler interceptor 源码 HandlerInterceptor

HandlerMapping 组件

HandlerMapping 组件,请求的处理器匹配器,负责为请求找到合适的 HandlerExecutionChain 处理器执行链,包含处理器(handler)和拦截器们(interceptors

  • handler 处理器是 Object 类型,可以将其理解成 HandlerMethod 对象(例如我们使用最多的 @RequestMapping 注解所标注的方法会解析成该对象),包含了方法的所有信息,通过该对象能够执行该方法
  • HandlerInterceptor 拦截器对处理请求进行增强处理,可用于在执行方法前、成功执行方法后、处理完成后进行一些逻辑处理

由于 HandlerMapping 组件涉及到的内容比较多,考虑到内容的排版,所以将这部分内容拆分成了四个模块,依次进行分析:

HandlerMapping 组件(二)之 HandlerInterceptor 拦截器

在上一篇《HandlerMapping 组件(一)之 AbstractHandlerMapping》文档中分析了 HandlerMapping 组件的 AbstractHandlerMapping 抽象类,在获取HandlerExecutionChain 处理器执行链时,会去寻找匹配的 HandlerInterceptor 拦截器们,并添加到其中。那么本文将分享 Spring MVC 的拦截器相关内容

HandlerInterceptor

org.springframework.web.servlet.HandlerInterceptor,处理器拦截器接口,代码如下:


public interface HandlerInterceptor {
	/**
	 * 前置处理,在 {@link HandlerAdapter#handle(HttpServletRequest, HttpServletResponse, Object)} 执行之前
	 */
	default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		return true;
	}

	/**
	 * 后置处理,在 {@link HandlerAdapter#handle(HttpServletRequest, HttpServletResponse, Object)} 执行成功之后
	 */
	default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable ModelAndView modelAndView) throws Exception {
	}

	/**
	 * 完成处理,在 {@link HandlerAdapter#handle(HttpServletRequest, HttpServletResponse, Object)} 执行之后(无论成功还是失败)
	 * 条件:执行 {@link #preHandle(HttpServletRequest, HttpServletResponse, Object)} 成功的拦截器才会执行该方法
	 */
	default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable Exception ex) throws Exception {
	}
}

HandlerExecutionChain

org.springframework.web.servlet.HandlerExecutionChain,处理器执行链,也就是通过 HandlerMapping 组件为请求找到的处理对象,包含处理器(handler)和拦截器们(interceptors

构造方法


public class HandlerExecutionChain {
	/**
	 * 处理器
	 */
	private final Object handler;

	/**
	 * 拦截器数组
	 */
	@Nullable
	private HandlerInterceptor[] interceptors;

	/**
	 * 拦截器数组。
	 *
	 * 在实际使用时,会调用 {@link #getInterceptors()} 方法,初始化到 {@link #interceptors} 中
	 */
	@Nullable
	private List<HandlerInterceptor> interceptorList;

	/**
	 * 已成功执行 {@link HandlerInterceptor#preHandle(HttpServletRequest, HttpServletResponse, Object)} 的位置
	 *
	 * 在 {@link #applyPostHandle} 和 {@link #triggerAfterCompletion} 方法中需要用到,用于倒序执行拦截器的方法
	 */
	private int interceptorIndex = -1;

	public HandlerExecutionChain(Object handler) {
		this(handler, (HandlerInterceptor[]) null);
	}

	public HandlerExecutionChain(Object handler, @Nullable HandlerInterceptor... interceptors) {
		if (handler instanceof HandlerExecutionChain) {
			HandlerExecutionChain originalChain = (HandlerExecutionChain) handler;
			this.handler = originalChain.getHandler();
			this.interceptorList = new ArrayList<>();
			// 将原始的 HandlerExecutionChain 的 interceptors 复制到 this.interceptorList 中
			CollectionUtils.mergeArrayIntoCollection(originalChain.getInterceptors(), this.interceptorList);
			// 将入参的 interceptors 合并到 this.interceptorList 中
			CollectionUtils.mergeArrayIntoCollection(interceptors, this.interceptorList);
		} else {
			this.handler = handler;
			this.interceptors = interceptors;
		}
	}
}
  • handler:请求对应的处理器对象,可以先理解为 HandlerMethod 对象(例如我们常用的 @RequestMapping 注解对应的方法会解析成该对象),也就是我们的某个 Method 的所有信息,可以被执行
  • interceptors:请求匹配的拦截器数组
  • interceptorList:请求匹配的拦截器集合,至于为什么要该属性,我还没看明白

    标签:HandlerMapping,拦截器,interceptors,public,handler,interceptor,源码,HandlerInterceptor
    From: https://blog.51cto.com/u_15668812/8934855

相关文章

  • llama的hf源码结构
    上一个博客我们看了rope.那么llama的hidden_states就没啥难点了.再整体把握一下hf里面llama的代码结构.文件是:D:\Users\admin\miniconda3\Lib\site-packages\transformers\models\llama\modeling_llama.py基座:classLlamaModel(LlamaPreTrainedModel):这个模型输入bs,se......
  • Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包
    学习视频:【编程不良人】2021年SpringBoot最新最全教程第十三章、拦截器拦截器:Interceptor拦截中断类似于javaweb中的Filter,不过没有Filter那么强大作用SpringMVC的拦截器是一种用于在请求处理过程中进行预处理和后处理的机制。拦截器可以在请求到达控制器之前和......
  • 数字化医学影像系统源码,采用C语言开发,支持MPR、CPR、MIP、SSD、VR、VE三维图像处理
    PACS系统是医院影像科室中应用的一种系统,主要用于获取、传输、存档和处理医学影像。它通过各种接口,如模拟、DICOM和网络,以数字化的方式将各种医学影像,如核磁共振、CT扫描、超声波等保存起来,并在需要时能够快速调取和使用。PACS系统还提供了辅助诊断和管理功能,可以在不同的影像设备......
  • llama的rope源码阅读
    关键代码的理解:classLlamaRMSNorm(nn.Module):def__init__(self,hidden_size,eps=1e-6):"""LlamaRMSNormisequivalenttoT5LayerNorm"""super().__init__()self.weight=nn.Parameter(to......
  • 开发医疗陪诊系统源码:搭建安全高效的医患互动平台
    本文将深入探讨开发医疗陪诊系统的源码,以及如何搭建一个安全高效的医患互动平台。一、引言医疗陪诊系统旨在通过技术手段,缩短患者与医生之间的距离,提供更快速、便捷的医疗服务。二、技术选型2.1前端技术在搭建医疗陪诊系统的前端时,我们可以选择使用现代化的前端框架,如Vue.js或React......
  • HydroOJ 从入门到入土(9)源码简易修改记录——卍解!
    随着OJ的使用越来越深入,本强迫症总会觉得一些细节有时候不那么符合自己的习惯,但是想改又无处下手,最终还是走上了修改源码的邪路.目录0.重要1.超级管理员查看自测代码2.超级管理员隐身查看比赛/作业题目3.超级管理员隐身查看比赛题目列表4.关掉客观题的多选题部......
  • centos7上源码安装postgresql 13.6
    1环境描述操作系统:Centos7.6postgresql:13.6安装方式:源码安装2创建用户#groupadd-g2000pgsql#useradd-u2000-gpgsqlpgsql3目录规划#mkdir-p/postgresql/{pgdata,archive,scripts,backup,pg13,soft,pg_log}#chown-Rpgsql:pgsql/postgresql#......
  • 智慧医疗APP开发指南:医疗陪诊系统源码实战
    本文将深入探讨智慧医疗APP开发中的医疗陪诊系统,重点介绍实际应用中的源码实战经验。 一、技术选型在开发医疗陪诊系统时,合理的技术选型是确保系统高效运行的关键。可以选择采用前后端分离的架构,使用Vue.js作为前端框架,SpringBoot作为后端框架,通过RESTfulAPI进行通信。二、实战经......
  • 记录 | ubuntu源码编译安装/更新boost版本
    一、卸载当前的版本1、查看当前安装的boost版本dpkg-S/usr/include/boost/version.hpp通过上面的命令,你就可以发现boost的版本了,查看结果可能如下:libboost1.54-dev:/usr/include/boost/version.hpp2、删除当前安装的boostsudoapt-getautoremovelibboost1.54-dev这样就可以删......
  • 记录 | ubuntu源码编译安装faiss
    ubuntu源码编译安装faiss#安装依赖aptupdateaptinstallbuild-essentiallibopenblas-devliblapack-devlibopencv-dev#clonegitclonehttps://github.com/facebookresearch/faiss.gitcdfaiss./configuremake-j32makeinstall使用示例:#include<faiss/IndexF......