【SpringMVC】拦截器

拦截器(Interceptor)是一种用于动态拦截方法调用的机制。在 Spring MVC 中,拦截器能够动态地拦截控制器方法的执行过程。以下是请求发送与接收的基本流程:

当浏览器发出请求时,请求首先到达 Tomcat 服务器。Tomcat 根据请求类型(静态资源或动态资源)进行处理。对于静态资源,Tomcat 直接返回相应的资源;而对于动态资源,请求会经过 Servlet 过滤器,接着交给 Spring 进行处理。Spring 通过中央控制器将请求分发到具体的 Controller 中,执行相应操作,并将处理后的数据返回给浏览器。

在这里插入图片描述

在这个过程中,可能会出现一些需求,例如权限控制和身份验证。为了在所有控制器的执行前或执行后统一处理这些操作,拦截器就此出现。拦截器允许我们在控制器方法执行的前后添加统一的逻辑,从而实现更灵活和易于管理的代码结构。概括而言,拦截器的作用包括:

  • 在指定的方法调用前后执行预先设定的代码
  • 阻止原始方法的执行

拦截器 vs 过滤器

在请求发送与接收的过程中,涉及到过滤器(Filter)和拦截器(Interceptor)。两者之间的主要区别如下:

  • 归属不同:过滤器属于 Servlet 技术,而拦截器则属于 Spring MVC 技术

  • 拦截内容不同:过滤器在 Tomcat 服务器阶段进行配置,对所有访问进行增强;而拦截器仅针对 Spring MVC 的请求进行增强。

拦截器使用

在实际开发过程中,拦截器的使用主要包括两个步骤:

  1. 制作拦截器功能类
  2. 配置拦截器的执行位置

(1)制作拦截器功能类

声明拦截器的 Bean,并实现 HandlerInterceptor 接口(注意:后续需要扫描加载 Bean)。具体地,创建一个 com.it.interceptor 包,在该包中创建一个拦截器 ProjectInterceptor,实现 HandlerInterceptor 接口,并且重写 preHandle、postHandle 和 afterCompletion 三个方法,这三个方法分别对应前置处理、后置处理和完成后处理:

@Component
public class ProjectInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle...");return true; // return false 时,将终止原始操作,后续的 postHandle 和 afterCompletion 也不会执行}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle...");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion...");}
}

当前置处理(对应 preHandle 方法)返回 false 时,将终止原始操作,后续的 postHandle 和 afterCompletion 也不会执行,过程如下图所示。

在这里插入图片描述

(2)配置拦截器的执行位置

在 com.it.config 包中定义配置类,该类继承 WebMvcConfigurationSupport,并实现 addInterceptor 方法(注意:后续需要扫描加载配置)。在方法中注册拦截器并设定拦截的访问路径,路径可以通过可变参数设置多个。

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {@Autowiredprivate ProjectInterceptor projectInterceptor;@Overrideprotected void addInterceptors(InterceptorRegistry registry) {// 所有以 /users 开头的访问路径都被拦截registry.addInterceptor(projectInterceptor).addPathPatterns("/users", "/users/*");}
}

(3)扫描加载

在 SpringMvcConfig 配置类中,多添加对 com.it.interceptor 和 com.it.config 包的扫描,以此完成对拦截器的加载:

@Configuration
@ComponentScan({"com.it.controller", "com.it.interceptor", "com.it.config"})
@EnableWebMvc
public class SpringMvcConfig {
}

(4)简化开发

上述拦截器的使用过程可以进一步简化。通过使用标准接口 WebMvcConfigurer,可以减少开发的复杂性。将 SpringMvcSupport 配置类与 SpringMvcConfig 配置类合并,可以有效降低代码量。

@Configuration
@ComponentScan({"com.it.controller", "com.it.interceptor"})
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {@Autowiredprivate ProjectInterceptor projectInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(projectInterceptor).addPathPatterns("/users", "/users/*");}
}

拦截器参数

(1)前置处理

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler
) throws Exception {System.out.println("preHandle...");return true;
}
  • 参数

    • request:请求对象
    • response:响应对象
    • handler:被调用的处理器对象,本质上是一个方法对象,对反射技术中的 Method 对象进行了再包装
  • 返回值

    • 返回值为 false 时,被拦截的处理器将不执行

(2)后置处理

public void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView modelAndView
) throws Exception {System.out.println("postHandle...");
}
  • 参数
    • modelAndview:如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行调整(现阶段开发模式下基本用不上)

(3)完成后处理

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex
) throws Exception {System.out.println("afterCompletion...");
}
  • 参数
    • ex:如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理

拦截器链配置

当配置多个拦截器时,会形成拦截器链。拦截器链的运行顺序遵循拦截器的添加顺序,具体执行顺序如下:

  • preHandle:按照配置顺序执行
  • postHandle:按照配置顺序的相反顺序执行
  • afterCompletion:同样按照配置顺序的相反顺序执行

此外,还有几点需要注意:

  • 如果某个拦截器拦截了原始处理器的执行,后续的拦截器将停止运行。
  • 如果拦截器的执行过程中发生中断,仅会执行在前面配置的拦截器的 afterCompletion 操作。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/498658.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python使用PyQt5,整套,桌面应用

安装 安装 pip install PyQt55.7.1 pip install PyQtWebEngine1、创建窗口,按百分比划分 from PyQt5.QtGui import QGuiApplication from PyQt5.QtWidgets import QApplication, QWidget # 创建应用程序实例 app QApplication([]) # 创建主窗口 window QWidget(…

018-spring-基于aop的事务控制

1 先配置平台事务管理器 2 在配置 spring提供的advice 3 事务增强的aop 总结&#xff1a; 事务就是要做2个配置&#xff1a; <!-- 1 开启事务管理器 不同的框架对应不同的事务管理器 --> <bean id"transactionManager" class"org.springframework.j…

《向量数据库指南》——Milvus Cloud 2.5:Sparse-BM25引领全文检索新时代

Milvus Cloud BM25:重塑全文检索的未来 在最新的Milvus Cloud 2.5版本中,我们自豪地引入了“全新”的全文检索能力,这一创新不仅巩固了Milvus Cloud在向量数据库领域的领先地位,更为用户提供了前所未有的灵活性和效率。作为大禹智库的向量数据库高级研究员,以及《向量数据…

2025决战智驾:从中阶卷到L3,车企需要抓好一个数据闭环

作者 |王博 编辑 |德新 全国都能开之后&#xff0c;智驾继续走向哪里&#xff1f; 2024年末&#xff0c;大部分主流车企已经实现了无&#xff08;高精度&#xff09;图全国都能开。而第一梯队的玩家&#xff0c;从以规则为主的算法框架&#xff0c;向神经网络模型为主的新架构…

优化大肠杆菌菌株和发酵工艺以提高L-赖氨酸生产-文献精读94

Optimizing Escherichia coli strains and fermentation processes for enhanced L-lysine production: a review 优化大肠杆菌菌株和发酵工艺以提高L-赖氨酸生产&#xff1a;综述 对比酵母酵母中de novo生物合成啤酒花活性类黄酮黄腐醇-文献精读93-CSDN博客 赖氨酸是一种重要…

如何在 Ubuntu 22.04 上安装 Varnish HTTP 教程

简介 在本教程中&#xff0c;我们将学习如何在 Ubuntu 22.04 服务器上安装和配置 Varnish HTTP。 Varnish 是一款高性能的 HTTP 加速器&#xff0c;旨在提高内容密集型动态网站的速度。它通过将网页缓存在内存中来工作&#xff0c;从而减少 Web 服务器的负载&#xff0c;并显…

CPT203 Software Engineering 软件工程 Pt.5 软件测试(中英双语)

文章目录 8. 软件测试8.1 Testing&#xff08;测试&#xff09;8.1.1 A note of testing under the V & A framework8.1.2 The Basics8.1.3 The Goals8.1.4 The Stages 8.2 Developing testing&#xff08;开发测试&#xff09;8.2.1 Unit testing&#xff08;单元测试&…

STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计

SMEC88ST SDK开发包下载 目前市场上很多嵌入式产品方案都是可以破解复制的&#xff0c;主要是因为方案主芯片不具备防破解的功能&#xff0c;这就导致开发者投入大量精力、财力开发的新产品一上市就被别人复制&#xff0c;到市场上的只能以价格竞争&#xff0c;最后工厂复制的产…

springcloud各个组件介绍

Spring Cloud 是一系列框架的集合&#xff0c;它基于 Spring Boot 提供了在分布式系统&#xff08;如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话和集群状态&#xff09;中快速构建一些常见模式的工具。下面是对 Sprin…

AAAI 2025论文分享┆一种接近全监督的无训练文档信息抽取方法:SAIL(文中附代码链接)

本推文详细介绍了一篇上海交通大学乐心怡老师课题组被人工智能顶级会议AAAI 2025录用的的最新论文《SAIL: Sample-Centric In-Context Learning for Document Information Extraction》。论文的第一作者为张金钰。该论文提出了一种无需训练的、以样本为中心的、基于上下文学习的…

基于JSP的健身俱乐部会员管理系统的设计与实现【源码+文档+部署讲解】

基于JSP的健身俱乐部会员管理系统的设计与实现 摘 要 目前我国虽然己经开发出了应用计算机操作的健身俱乐部管理系统&#xff0c;但管理软件&#xff0c;管理方法和管理思想三者往往相脱节。造成我国健身俱乐部信息管理系统极端化的缺陷。在国外健身俱乐部已经有了一整套涉猎了…

2024 年度总结

时光荏苒&#xff0c;2024 年即将画上句号&#xff0c;回顾这一年的写博历程&#xff0c;有付出、有收获、有成长&#xff0c;也有诸多值得回味与反思的瞬间。 一、内容创作 主题涉猎&#xff1a;这一年&#xff0c;我致力于探索多样化的主题&#xff0c;以满足不同读者群体的…

SonarQube相关的maven配置及使用

一、maven 全局配置 <settings><pluginGroups><pluginGroup>org.sonarsource.scanner.maven</pluginGroup></pluginGroups><profiles><profile><id>sonar</id><activation><activeByDefault>true</acti…

Python用K-Means均值聚类、LRFMC模型对航空公司客户数据价值可视化分析指标应用|数据分享...

全文链接&#xff1a;https://tecdat.cn/?p38708 分析师&#xff1a;Yuling Fang 信息时代的来临使得企业营销焦点从产品中心转向客户中心&#xff0c;客户关系管理成为企业的核心问题&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 客户关系管理的关键是客…

委外加工业务如何调整原材料的消耗-MIGO A11-后续调整

业务背景&#xff1a;用户反馈委外加工业务回收后&#xff0c;产品已经销售&#xff0c;但委外加工结算时要对原材料消耗时行调整。如果没有销售&#xff0c;准备采用收货冲销后重新收货&#xff0c;但现在已经是2024年最后一天了。。。销售业务已经做完。不可能再冲销。其实这…

工作中常用Vim的命令

Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 目录 0. ctags -R 1.认识 Vim的几种工作模式 2.高频使用命令 2.1 修改文件 2.2 关于行号 2.3 删除多行&#xff0c;删除部分 2.4 复制粘贴 2.5 光标移动 2.…

2、redis的持久化

redis的持久化 在redist当中&#xff0c;高可用的技术包括持久化&#xff0c;主从复制&#xff0c;哨兵模式&#xff0c;集群。 持久化是最简单的高可用的方法&#xff0c;作用就是备份数据。即将数据保存到硬盘&#xff0c;防止进程退出导致数据丢失。 redis持久化方式&…

QT----------常用界面组件的使用

一、QComboBox 类 主要功能&#xff1a;提供一个下拉列表&#xff0c;用户可以从中选择一个或多个选项。 #include <QApplication> #include <QComboBox> #include <QVBoxLayout> #include <QWidget> #include <QMessageBox>int main(int argc…

【GridView渐进全解】第四部分GridView分页进阶

目录 一、启用分页 二、修改GridView分页模板 1.进入控件模板修改视图&#xff1a; 2.进入页码模板&#xff08;PagerTemplate&#xff09;视图 3.添加导航按钮控件 4.修改导航控件属性 三、输入页号跳转 1.进入页码模板视图 2.添加文本框及按钮控件 3.编写代码 【接…

单词统计详解---pyhton

有一个.txt的文本文件&#xff0c;对齐单词进行统计&#xff0c;并显示单词重复做多的10个单词 思路&#xff1a; 1将文本文件进行逐行处理&#xff0c;并进行空格分割处理 2新建一个字典&#xff0c;使用get方法将单词一次添加到字典中&#xff0c;并用sorted方法进行排序。…