拦截器抛出异常无法被全局异常处理器捕获问题

文章目录

  • 基本说明
  • 问题描述
  • 问题原因
  • 解决方法
    • 前端执行的所有请求都通过Controller,而不是直接访问html
    • 定义一个/error路径的方法
  • 总结

基本说明

我的前后端项目是放在一起的,前后端都是由springMVC进行控制,但是现在我在拦截器的preHandle方法中抛出的异常并没有被全局异常处理器捕获到。下面是我的项目结构

image-20240401114905873

问题描述

我定义了一个拦截器,并且将其注入到了spring容器

image-20240401091527985

image-20240401091640914

然后在全局异常处理器中对异常进行了处理

image-20240401091730974

这个时候,如果我没有登录就访问主页面,那么程序并不会执行到handleLoginException方法,而是直接去调寻找/error路径的页面

image-20240401092035167

可以看见,我访问的页面是http://localhost/admin/index.html,当我没有登录的时候应该跳转到登录页面,也就是login.html,但是在拦截器的preHandle抛出异常之后并没有被全局异常处理器捕获,而是再去寻找/error路径的处理器,然后又被拦截->抛出异常->寻找/error处理器->拦截,直接就产生了循环。

问题原因

想要分析这个问题,那么就要去看springMVC源码了。

首先找到org.springframework.web.servlet.DispatcherServlet#doDispatch,这个就是springMVC的核心。在这个方法里面找到执行preHandle的方法

image-20240401092822089

现在已知preHandle中会抛出一个LoginException异常,于是直接看catch中的代码

image-20240401093035930

可以发现会将异常记录,然后执行processDispatchResult方法

image-20240401093432890

继续查看processHandlerException方法

image-20240401093546589

这个方法里面就是遍历所有的异常解析器来解析,首先看看DefaultErrorAttributes的解析器

image-20240401094602805

这里就是简单的记录一下,然后去查看HandlerExceptionResolverComposite

image-20240401094854991

可以发现在在里面又有3个解析器来对异常进行解析,需要关注的就是的一个异常解析器,这个就是处理全局异常的,继续往里面看

image-20240401095041586

可以发现首先会对handler进行检查

image-20240401100125173

可以发现这里会直接返回false,也就是并不会对异常进行处理,然后异常会一直往外面抛,最终执行到org.apache.catalina.core.StandardHostValve#status方法,然后返回一个默认/error路径

image-20240401102528335

这里就有疑问了,为什么在全局异常处理器不会对preHandle抛出的异常进行处理呢?如下

image-20240401104255991

原因就是DispathcerServlet#doDispatch中获取执行链时,发现请求的是一个页面,而不是Controller,于是就导致了执行上面的shouldApplyTo方法时不会进行处理,直接返回false。

解决方法

前端执行的所有请求都通过Controller,而不是直接访问html

定义一个admin/index方法,返回admin/index.html页面

image-20240401115346936

这样在执行getHandler时就可以获取到执行器链

image-20240401110552411

这样在preHandle中抛出的异常就可以被解析

image-20240401110648490

执行异常处理器的方法

image-20240401110906868

image-20240401111044873

可以发现上面的异常就可以被全局异常处理器捕获了

定义一个/error路径的方法

由于默认情况下会打到error,可以将默认返回的页面写到该方法中。

image-20240401114226778

总结

如果前后端项目放在一起写,前端项目的访问也由springMVC来控制,那么当访问前端页面时,如果在拦截器preHandle中抛出异常,这个异常并不会被全局异常处理器所捕获,而是会将该错误一直往上抛,最终由org.apache.catalina.core.StandardHostValve#status方法所处理,会默认去访问htpp://localhost/error接口。

是会将该错误一直往上抛,最终由org.apache.catalina.core.StandardHostValve#status方法所处理,会默认去访问htpp://localhost/error接口。

如果请求的是后端定义的接口,那么在preHandle中抛出的异常会被全局异常处理器捕获

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HAL STM32主从定时器联级使用

HAL STM32主从定时器联级使用 具体介绍参考STM32参考手册 🌿主从定时器联级:使用一个定时器作为另一个定时器的预分频器。 🍁时钟关系: 🌿TIM1 和TIM8 控制寄存器 2(TIMx_CR2)相关位: 🔖主…

Redis性能管理及主从复制、哨兵的配置与部署

一、redis性能管理 1.1 查看Redis内存使用 1.2 内存碎片率 1.3 内存使用率 1.3.1 避免内存交换发生的方法 1.4 内回收key 1.4.1 配置文件中修改 maxmemory-policy 属性值 1.5 缓存穿透 1.5.1 原因 1.5.2 条件 1.5.3 解决方案 1.6 缓存击穿 1.6.1 原因 1.6.2 现象…

移位运算与乘法

描述 题目描述: 已知d为一个8位数,请在每个时钟周期分别输出该数乘1/3/7/8,并输出一个信号通知此时刻输入的d有效(d给出的信号的上升沿表示写入有效) 信号示意图: 波形示意图: 输入描述&#…

Leetcode 215. 数组中的第K个最大元素

心路历程: 这道题本质上是排序不完全的过程,而且这道题有bug,直接用python的排序算法其实就能AC。 可以按照快排排到找到k-1个large元素的思维去做,不过这道题需要考虑空间复杂度,所以需要用指针快排。 其实也可以考虑…

SUPS:一种用于自动驾驶的仿真地下泊车场景数据集

SUPS:一种用于自动驾驶的仿真地下泊车场景数据集 附赠自动驾驶学习资料和量产经验:链接 摘要 本文介绍了SUPS:一种用于自动驾驶的仿真地下泊车场景数据集。随着自动驾驶的范围扩大,自动地下泊车引起了人们极大的关注。自动驾驶汽…

【stm32】软件I2C读写MPU6050

软件I2C读写MPU6050(文章最后附上源码) 编码 概况 首先建立通信层的.c和.h模块 在通信层里写好I2C底层的GPIO初始化 以及6个时序基本单元 起始、终值、发送一个字节、接收一个字节、发送应答、接收应答 写好I2C通信层之后,再建立MPU6050的.c和.h模块 基于I2C通…

京东云幻兽帕鲁4核16G服务器优惠价格26元1个月、398元一年

京东云幻兽帕鲁4核16G服务器优惠价格26元1个月、658元1年、三年3098元,配置为:轻量云主机4C16G-100G SSD系统盘-5M带宽-1000G月流量 华北-北京,京东云优惠活动 yunfuwuqiba.com/go/jd 活动链接打开如下图: 幻兽帕鲁4核16G服务器优…

计算机网络-TCP重传、滑动窗口、流量控制、拥塞控制

重传机制 超时重传:超时重传时间(RTO)设定为略大于RTT(动态)。触发场景包括自己发送的数据包丢失和别人给自己的回应数据包丢失。启动重传机制后如果还没有收到数据包,则RTO设置为上次的两倍,直…

双连通分量算法

1. 连通图概念 连通图:无向图任意两点之间存在通路。 强连通:有向图(前提)中,任意两点都有至少一条通路,则此图为强连通图。 弱连通图:将有向图的有向边换成无向边得到的图是连通图&#xff0c…

Tomcat管理配置

Tomcat管理配置 1 host-manager项目2 manager项目 Tomcat 提供了Web版的管理控制台,位于webapps目录下。Tomcat 提供了用于管理Host的host-manager和用于管理Web应用的manager。 1 host-manager项目 Tomcat启动之后,可以通过 http://localhost:8080/ho…

Cortex-M7 外设(peripherals)总览

1 PPB内存映射总览 由Cortex-M7的内存映射模型可知,0xE000_0000~0xE00F_FFFF地址空间为私有外设总线 (Private peripheral bus,PPB)的内存区域,其具体的地址映射如表1所示。 表1 PPB寄存器内存映射 其中,注释后缀的相关含义如…

5.5.1MFC对话框——文件对话框

本文仅供学习交流,严禁用于商业用途,如本文涉及侵权请及时联系将于24小时内删除 目录 1.实验原理 2.示例说明 1.实验原理 CFileDialog类 用CFileDialog类提供的通用文件对话框,实现Windows标准的【打开】和【另存为】功能。 CFileD…

前端canvas项目实战——在线图文编辑器(八):复制、删除、锁定、层叠顺序

目录 前言一、效果展示二、实现步骤1. 复制2. 删除3. 锁定4. 层叠顺序 三、实现过程中发现的bug1. clone方法不复制自定义属性2. 复制「锁定」状态的对象,得到的新对象也是「锁定」状态 四、Show u the code后记 前言 上一篇博文中,我们细致的讲解了实现…

如何在没有备份的情况下从 iPad 恢复照片?

有很多操作都可能导致iPad照片丢失,包括误删除、出厂设置、iPad的iOS更新等。如果没有备份,似乎没有办法找回它们。然而,即使您将备份保留在 iCloud 或iTunes上,这些方式也需要您的 iPad 首先重置,从而用备份内容覆盖当…

Java-类型转换

Java数据类型转换的规则掌握后,将使我们对以后的学习事半功倍,下面是我列出的一些重点。 类型转换 由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换。底到高依次是:byte,short,char->int->lo…

AJAX 原理

一、AJAX原理 - XMLHttpRequest 定义: 关系:axios 内部采用 XMLHttpRequest 与服务器交互。 好处:掌握使用 XHR 与服务器进行数据交互,了解 axios 内部原理。 1.1 使用 XMLHttpRequest: 步骤: 1. 创建 XM…

OpenHarmony开发-系统烧录

本文详细介绍了烧录OpenHarmony系统到开发板的操作流程。从基础的硬件准备和软件环境设置入手,详细说明了如何配置开发环境、构建系统镜像等过程,详细描述了烧录过程中的关键步骤,以及如何使用专用工具将OpenHarmony系统镜像传输到开发板。同…

ffmpeg 将多个视频片段合成一个视频

ffmpeg 将多个视频片段合成一个视频 References 网络视频 6 分钟的诅咒。 新建文本文件 filelist.txt filelist.txtfile output_train_video_0.mp4 file output_train_video_1.mp4 file output_train_video_2.mp4 file output_train_video_3.mp4 file output_train_video_4.m…

PowerJob 分布式任务调度简介

目录 适用场景 设计目标 PowerJob 功能全景 任务调度 工作流 分布式计算 动态容器 什么是动态容器? 使用场景 可维护性和灵活性的完美结合 实时日志&在线运维 PowerJob 系统组件 PowerJob 应用场景 PowerJob 的优势 PowerJob(原OhMyScheduler&…

【opencv】示例-aruco_dict_utils.cpp 计算 ArUco 字典度量

该程序可用于计算 ArUco 字典度量。 要计算考虑翻转标记的指标&#xff0c;请使用 -r 标志。 该程序可用于创建和编写自定义 ArUco 词典。 #include <opencv2/objdetect/aruco_detector.hpp> // 包含aruco marker检测相关功能的头文件 #include <iostream> // 包含…