当前位置: 首页 > 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. 创建…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...

MeshGPT 笔记

[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭&#xff01;_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...