当前位置: 首页 > news >正文

SpringMVC的拦截器和异常处理器

目录

lerInterceptor 拦截器

1、拦截器的作用

2、拦截器的创建

3、拦截器的三个抽象方法

4、拦截器的配置

5、多个拦截器的执行顺序

SpringMVC的异常处理器

1、异常处理器概述

2、基于配置文件的异常处理

3、基于注解的异常处理


lerInterceptor 拦截器

1、拦截器的作用

拦截器的作用时机

SpringMVC的拦截器作用于 控制器方法执行的前后

有不同的拦截方法,作用于控制器方法执行之前、之后、以及视图渲染之后三个阶段

拦截器与过滤器的区别

过滤器是原生Serlvet的组件,作用于Servlet执行之前

拦截器是SpringMVC的模块,作用于控制器方法执行前、后、渲染视图后。

2、拦截器的创建

SpringMVC中的拦截器需要实现HandlerInterceptor接口

示例

public class FirstInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("控制器方法准备执行...");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("控制器方法执行完毕...");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("视图渲染完毕...");}
}

3、拦截器的三个抽象方法

HandlerInterceptor接口有三个抽象方法:

  • preHandle控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行
    • 返回true为放行,即调用控制器方法
    • 返回false表示拦截,即不调用控制器方法
  • postHandle控制器方法执行之后执行postHandle()
  • afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()

源码分析,为什么preHandle能实现拦截控制器方法

//DispatherServlet
if (!mappedHandler.applyPreHandle(processedRequest, response)) {//如果applyPreHandle方法返回的是false,就直接return,不再执行下面的内容return;
}//执行控制器方法
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
//渲染视图
...//applyPreHandle方法
boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {for (int i = 0; i < this.interceptorList.size(); i++) {HandlerInterceptor interceptor = this.interceptorList.get(i);if (!interceptor.preHandle(request, response, this.handler)) {triggerAfterCompletion(request, response, null);//如果当前拦截器的preHandle方法返回false,applyPreHandle方法也返回falsereturn false;}this.interceptorIndex = i;}return true;
}

注意

SpringMVC配置文件中的view-controller视图控制器标签,也会被拦截器拦截

4、拦截器的配置

SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置。

拦截器有三种配置方式,一般使用第三种,可以配置拦截范围。

方式一 在interceptors中配置自定义拦截器的bean标签

<!--配置拦截器-->
<mvc:interceptors><bean class="com.csai.interceptors.FirstInterceptor"/>
</mvc:interceptors>

这种方式无法指定拦截范围,是对DispatcherServlet所处理的所有的请求进行拦截

方式二 在interceptors中引用自定义拦截器的bean id

<bean id="firstInterceptor" class="com.csai.interceptors.FirstInterceptor"/><!--配置拦截器-->
<mvc:interceptors><ref bean="firstInterceptor"/>
</mvc:interceptors>

和上面一样,这种方式无法指定拦截范围,是对DispatcherServlet所处理的所有的请求进行拦截

配置自定义拦截器的bean时,可以使用配置文件,也可以使用@Component注解+组件扫描的方式

方式三 使用<mvc:interceptor>标签进行配置

<bean id="firstInterceptor" class="com.csai.interceptors.FirstInterceptor"/><!--配置拦截器-->
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><mvc:exclude-mapping path="/testInterceptor"/><ref bean="firstInterceptor"/></mvc:interceptor>
</mvc:interceptors>

可以配置三个属性:

  • mapping拦截请求的请求地址,可以使用Ant风格的路径
  • exclude-mapping不会被拦截的请求地址,即拦截白名单
  • bean/ref:指定拦截器的bean

例如这里是拦截所有请求,不拦截testInterceptor页面,对应的拦截器是firstInterceptor

5、多个拦截器的执行顺序

如果匹配到的多个拦截器的preHandle()方法都返回true

此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关:

  • preHandle()会按照配置的顺序执行,即先配置的先执行

  • postHandle()和afterComplation()会按照配置的反序执行,即先配置的后执行,因为是嵌套的关系。

示例,请求访问,匹配到一个控制器方法,两个拦截器:

配置顺序:

<!--配置拦截器-->
<mvc:interceptors><ref bean="Interceptor A"/><ref bean="Interceptor B"/>
</mvc:interceptors>

执行顺序:

preHandle A --> true

preHandle B --> true

--- 控制器方法执行 ---

--- 控制器方法执行完毕 ---

postHandle B

postHandle A

--- 视图渲染完毕 ---

afterComplation B

afterComplation A

如果匹配到多个拦截器,有的拦截器的preHandle()方法返回了false

先看结果:对于同一个控制器方法,只要存在拦截器的preHandle()方法返回了false,控制器方法就不会执行。

  • 在它之前配置的拦截器,和它自己的preHandle()都会执行
  • 所有的postHandle()都不执行,因为控制器方法没有执行
  • 在它之前配置的拦截器,afterComplation()会执行
  • 在它之后配置的拦截器,所有方法都不会执行。

示例 请求访问,匹配到一个控制器方法,两个拦截器,其中一个返回false:

配置顺序:

<!--配置拦截器-->
<mvc:interceptors><ref bean="Interceptor A"/><ref bean="Interceptor B"/>
</mvc:interceptors>

Interceptor B 的preHandle()返回false

执行顺序:

preHandle A --> true

preHandle B --> false

--- 控制器方法不执行 ---

afterComplation A

SpringMVC的异常处理器

1、异常处理器概述

异常处理器的作用

用于处理SpringMVC 控制器方法执行过程中 产生的异常。

SpringMVC提供了一个处理 控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver

HandlerExceptionResolver接口的实现类:

  • DefaultHandlerExceptionResolver,是SpringMVC默认使用的异常处理器
  • SimpleMappingExceptionResolver,用于自定义 异常处理器

自定义异常处理器的使用场景

大致有两个作用:

  1. 对系统异常提供自定义处理。比如出现某个异常时,跳转到服务器繁忙的页面,用户就不会看到500这类的页面了
  2. 提供对自定义异常的处理方案

2、基于配置文件的异常处理

SpringMVC提供了自定义的异常处理器SimpleMappingExceptionResolver

示例 实现错误页面跳转

<!--配置异常处理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><!--如果出现ArithmeticException数学异常,就跳转到error视图--><prop key="java.lang.ArithmeticException">error</prop></props></property>
</bean>

properties的键表示处理器方法执行过程中出现的异常

properties的值表示若出现指定异常时,设置一个新的视图名称,跳转到指定页面

测试

error页面

<h3>服务器繁忙!</h3>

控制器方法

@RequestMapping("/testInterceptor")
public String testInterceptor(){//创造一个数学异常Integer i = 3/0;return "success";
}

发生异常后,就会被自定义的异常处理器捕获,跳转到错误页面

示例 实现异常信息的捕获

配置文件

<!--配置异常处理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><!--如果出现ArithmeticException数学异常,就跳转到error视图--><prop key="java.lang.ArithmeticException">error</prop></props></property><property name="exceptionAttribute" value="exception"/>
</bean>

配置exceptionAttribute属性,设置一个value

异常信息就会存入request域中,键名为设置的value,值为异常信息。

前端页面展示错误信息

<h3>服务器繁忙!</h3>
<p th:text="${exception}"></p>

3、基于注解的异常处理

使用注解,实现获取异常信息和跳转错误页面

@ControllerAdvice
public class ExceptionController {@ExceptionHandler(value = {ArithmeticException.class})public String testException(Exception exception, Model model){model.addAttribute("exception", exception);return "error";}}

原理:如果遇到了@ExceptionHandler 注解 标识的这些异常,就调用 此 @ExceptionHandler 注解对应的控制器方法。

使用注解,在配置文件中就不需要配置任何关于异常处理器的内容。

相关文章:

SpringMVC的拦截器和异常处理器

目录 lerInterceptor 拦截器 1、拦截器的作用 2、拦截器的创建 3、拦截器的三个抽象方法 4、拦截器的配置 5、多个拦截器的执行顺序 SpringMVC的异常处理器 1、异常处理器概述 2、基于配置文件的异常处理 3、基于注解的异常处理 lerInterceptor 拦截器 1、拦截器的作…...

查看库文件是32位还是64位|查看lib是静态库还是导入库|判断是debug模式还是release模式

文章目录 dll位数查看lib位数查看查看lib库是静态库还是导入库dll库文件信息查看lib库文件内容查看dll库查看编译模式是debug还是release方法一方法二方法三 lib静态库查看编译模式是debug还是release方法一方法二 lib导入库查看编译模式是debug还是release查看Linux下的.a库&a…...

Python小姿势 - Python爬取数据的库——Scrapy

Python爬取数据的库——Scrapy 一、爬虫的基本原理 爬虫的基本原理就是模拟人的行为&#xff0c;使用指定的工具和方法访问网站&#xff0c;然后把网站上的内容抓取到本地来。 爬虫的基本步骤&#xff1a; 1、获取URL地址&#xff1a; 2、发送请求获取网页源码&#xff1b; 3、…...

[C++初阶]栈和队列_优先级队列的模拟实现 deque类 的理解

为了更好的理解优先级队列priority_queue&#xff0c;这里会同时进行栈和队列的提及 文章目录 简要概念&#xff08;栈和队列&#xff09;栈和队列的模拟实现与使用stack&#xff08;栈&#xff09;deque的理解和操作queue priority_queue&#xff08;优先级队列&#xff09;框…...

Spring是什么?关于Spring家族

初识Spring 什么是Spring&#xff1f; Spring是一个开源的Java企业级应用程序开发框架&#xff0c;由Rod Johnson于2003年创建&#xff0c;并在接下来的几年里得到了广泛的发展和应用。它提供了一系列面向对象的编程和配置模型&#xff0c;支持开发各种类型的应用程序&#x…...

自然语言处理数据集集锦(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 最近更新时间&#xff1a;2023.4.26 最早更新时间&#xff1a;2023.4.25 文本摘要主题的数据集见我之前写的另一篇博文&#xff1a;文本摘要数据集的整理、总结及介绍&#xff08;持续更新ing…&#xff09; 智能司法主题的数据集我准备等项目…...

93、Dehazing-NeRF: Neural Radiance Fields from Hazy Images

简介 论文&#xff1a;https://arxiv.org/pdf/2304.11448.pdf 从模糊图像输入中恢复清晰NeRF 使用大气散射模型模拟有雾图像的物理成像过程&#xff0c;联合学习大气散射模型和干净的NeRF模型&#xff0c;用于图像去雾和新视图合成 通过将NeRF 3D场景的深度估计与大气散射模…...

JAVA子类与继承

目录 JAVA子类与继承 一、子类与父类: 二、子类与对象 三、成员变量的隐藏和方法重写 四、super关键字&#xff08;P122&#xff09; 五、final关键字 六、对象的上转型对象&#xff08;P126&#xff09; 七、继承与多态&#xff08;P128&#xff09; 八、abstract类和…...

62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库

文章目录 62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库62.1 创建数据库示例 62.2 查看数据库示例 62.3 选择数据库示例 62.4 删除数据库示例 62.5 备份数据库示例 62.6 恢复数据库示例 62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库 62.1 创建数据库…...

【分布式搜索引擎ES01】

分布式搜索引擎ES 分布式搜索引擎ES1.elasticsearch概念1.1.ES起源1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引 1.3.es的一些概念1.3.1.文档和字段1.3.2.索引和映射1.3.3.mysql与elasticsearch 1.4.1安装es、kibana、IK分词器1.4.2扩展词词典与停用词词典 2.索引库操作2.1.mappi…...

1.3 鞅、停时和域流-鞅(布朗运动与随机计算【习题解答】)

Let X = ( x n , F n ) , n = 1 , ⋯   , N X=\left(x_n, \mathcal{F}_n\right), n=1, \cdots, N X...

十、ElasticSearch 实战 - 源码运行

一、概述 想深入理解 Elasticsearch&#xff0c;了解其报错机制&#xff0c;并有针对性的调整参数&#xff0c;阅读其源码是很有必要的。此外&#xff0c;了解优秀开源项目的代码架构&#xff0c;能够提高个人的代码架构能力 阅读 Elasticsearch 源码的第一步是搭建调试环境&…...

GPT-3 论文阅读笔记

GPT-3模型出自论文《Language Models are Few-Shot Learners》是OpenAI在2020年5月发布的。 论文摘要翻译&#xff1a;最近的工作表明&#xff0c;通过对大量文本进行预训练&#xff0c;然后对特定任务进行微调&#xff08;fine-tuning)&#xff0c;在许多NLP任务和基准测试上…...

方案解析丨数字人主播如何成为电商直播新标配

浙江省政府办公厅近日印发《关于进一步扩大消费促进高质量发展若干举措》支持电子商务直播发展。抢抓电子商务直播快速发展机遇&#xff0c;发展数字人虚拟主播、元宇宙新消费场景等新业态新模式。 随着电商直播快速发展&#xff0c;企业怎么高效地实现引流获客&#xff0c;成为…...

Python最全迭代器有哪些?

python中迭代器的使用是最广泛的&#xff0c;凡是使用for语句&#xff0c;其本质都是迭代器的应用。 从代码角度看&#xff0c;迭代器是实现了迭代器协议的对象或类。迭代器协议方法主要是两个&#xff1a; __iter__()__next__() __iter__()方法返回对象本身&#xff0c;他是…...

ESP32 网络计时器,包含自动保存

简介 本代码是基于ESP32开发板实现的一个计时器功能&#xff0c;具备倒计时、计时器时长选择、显示当前时间、有源蜂鸣器报警等功能。代码中使用了WiFi网络连接、NTP时间同步、EEPROM存储等功能。通过按钮控制计时器的开始、停止和计时器时长的选择。 运行原理概述 在ESP32开…...

【ChatGPT】阿里版 ChatGPT 突然官宣意味着什么?

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 阿里版 ChatGPT 突然官宣 ​ ChatGPT 技术在 AI 领域的重要性 自然语言生成 上下文连续性 多语言支持 ChatGPT 未来可能的应用场景 社交领域 商业领域 ​编辑 医疗领域…...

IPEmotion控制模块-PID循环应用

IPEmotion专业版、开发版支持控制模块&#xff0c;并且该模块支持函数发生器、PID控制器、路由器、序列控制和序列控制块以及参考曲线生成器。本文主要针对PID&#xff08;P&#xff1a;Proportional control 比例控制&#xff1b;I&#xff1a;Integral control 积分控制&…...

【元分析研究方法】学习笔记2.检索文献(含100种学术文献搜索清单链接)

检索文献 该步骤的作用该步骤中需要注意的问题该步骤中部分知识点我的收获 参考来源&#xff1a;库珀 (Cooper, H. M. )., 李超平, & 张昱城. (2020). 元分析研究方法: A step-by step approach. 中国人民大学出版社. 该步骤的作用 1.识别相关文献的来源&#xff1b; 2.识别…...

题目:16版.自由落体

1、实验要求 本实验要求&#xff1a;模拟物体从10000米高空掉落后的反弹行为。 1-1. 创建工程并配置环境&#xff1a; 1-1.1. 限制1. 工程取名&#xff1a;SE_JAVA_EXP_E009。 1-1.2. 限制2. 创建包&#xff0c;取名&#xff1a;cn.campsg.java.experiment。 1-1.3. 限制3. 创建…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...