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

文章目录

  • 基本说明
  • 问题描述
  • 问题原因
  • 解决方法
    • 前端执行的所有请求都通过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中抛出的异常会被全局异常处理器捕获

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

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

相关文章

蓝桥杯单元测试专项练习Java版(单元测试4)(修正版)

关于简单循环覆盖法可以看看这里我的上一个文章http://t.csdnimg.cn/k92fn\ 题目4链接:单元测试专项练习(JavaPython) - 第四题单元测试题目(Java) - 蓝桥云课 (lanqiao.cn) 目录 题目描述 源代码功能 原题: Datas.java Good…

自动驾驶_交通标志识别:各目标检测算法评测

自动驾驶|交通标志识别:各目标检测算法评测 论文题目:Evaluation of Deep Neural Networks for traffic sign detection systems 开源代码:https://github.com/aarcosg/traffic-sign-detection 附赠自动驾驶学习资料和量产经验:…

计算机视觉——基于傅里叶幅度谱文档倾斜度检测与校正

概述 在计算机视觉领域,处理文档数据时,OCR算法的性能往往会受到文档的倾斜度影响。如果文档在输入到模型之前没有经过恰当的校正,模型就无法期待模型能够提供准确的预测结果,或者模型预测的精度会降低。例如,在信息提…

助力蓝桥杯单片机省一————模块之超声波

距离蓝桥杯单片机省赛还有7天 本次介绍的模块是超声波模块,将使用定时器1和PCA进行距离的测量。如果对PCA还未了解的,可以打开官方给的芯片数据手册,自行查看。 一、超声波测量原理 二、产生8个40KHz的超声波 void Init_wave() {unsigned …

7 个 iMessage 恢复应用程序/软件可轻松恢复文本

由于误操作、iOS 升级中断、越狱失败、设备损坏等原因,您可能会丢失 iPhone/iPad 上的 iMessages。意外删除很大程度上增加了这种可能性。更糟糕的是,这种情况经常发生在 iDevice 缺乏备份的情况下。 (iPhone消息消失还占用空间?&…

实际项目中如何使用Git做分支管理

前言 Git是一种强大的分布式版本控制系统,在实际项目开发中使用Git进行分支管理是非常常见的做法,因为它可以帮助团队高效的协作和管理项目的不同版本,今天我们来讲讲在实际项目中最常用的Git分支管理策略Git Flow。 常见的Git分支管理策略…

【开源语音项目OpenVoice](一)——实操演示

目录 一、前菜 1、Python选择 2、pip源切换 3、ffmpeg配置问题 4、VSCode添加Jupyter扩展 二、配置虚拟环境 1、下载源码 方法一 直接下载源码压缩包 方法二 使用git 1)git加入鼠标右键 2)git clone源码 2、VSCode出场 1)创建pyth…

第二十五周代码(蓝桥杯查缺补漏)

2024/03/31 周日 填充 题目链接 【参考代码】 想用暴力&#xff0c;没过 //枚举&#xff0c;未出结果QAQ #include <bits/stdc.h> using namespace std; string s00 "00"; string s11 "11"; int ans 0; //m个问号&#xff0c;子串有2^m…

1-32 异常

一 什么是异常? 1.含义:异与正常状态的显示,控制台显示的结果和预期的结果不一致 2.例如: int[] nums new int[2]; System.out.println(nums[2]); --抛出异常 二 异常分类 1.检测性异常:又称 非运行时异常,一般编写代码过程中编辑器直接报错 2.非检测性异常(常用):又称为…

牛客 2024春招冲刺题单 ONT98 牛牛猜节点【中等 斐波那契数列 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/6a3dfb5be4544381908529dc678ca6dd 思路 斐波那契数列参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规…

让chatGPT控制物理设备

作为自动控制行业的工程师&#xff0c;我们也许最关心的是如何使chatGPT 控制物理设备。我发现许多人仍然停留在传统程序设计的思维阶段&#xff0c;比如让大模型编写一段PLC 代码&#xff0c;或者是生成一些信息模型。 其实大模型具备判断与思考的能力&#xff0c;AI …

ARM v8 Cortex R52内核 02 程序模型 Programmers Model

ARM v8 Cortex R52内核 02 程序模型 Programmers Model 2.1 关于程序模型 Cortex-R52处理器实现了Armv8-R架构。这包括&#xff1a; 所有的异常级别&#xff0c;EL0-EL2。 每个异常级别下的AArch32执行状态。 T32和A32指令集&#xff0c;其中包括&#xff1a; 浮点运算。 …

Day:004(2) | Python爬虫:高效数据抓取的编程技术(数据解析)

正则表达式实战-腾讯新闻 需求&#xff1a; 使用正则获取腾讯新闻标题内容 网站&#xff1a;https://sports.qq.com/ 代码&#xff1a; import reimport requests from fake_useragent import UserAgenturl https://sports.qq.com/ # 构建请求头信息 headers {User-Agent:…

【Frida】【Android】 工具篇:ProxyPin抓包详解

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

SSL VPN

1、SSL (Secure Sockets Layer)一种加密的通讯协定,用在使用者与网服器之间 【1】安全套接层 位于传输层和应用层之间,保护应用层的数据(HTTPS(443)=HTTP+TLS) 【2】版本 SSLv2 SSLv3 修改→TLS (Transport Layer Security)安全传输层协议,) 【3】模式 采用…

Linux文件种类、扩展名与目录配置详解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 二、Linux文件种类 1、纯…

高精度端到端在线校准环视相机和LIDAR(精度0.2度内!无需训练数据)

高精度端到端在线校准环视相机和LIDAR&#xff08;精度0.2度内&#xff01;无需训练数据&#xff09; 附赠自动驾驶学习资料和量产经验&#xff1a;链接 写在前面 在自动驾驶车辆的使用寿命内&#xff0c;传感器外参校准会因振动、温度和碰撞等环境因素而发生变化。即使是看似…

分布式锁实战

4、分布式锁 4.1 、基本原理和实现方式对比 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁&#xff0c;只要大家使用的是同一把锁&#xff0c;那么我们就能锁住线程&#xff0c;不让线程进行&#x…

python爬虫学习第十五天-------ajax的get和post请求

嗨嗨嗨&#xff01;兄弟姐妹大家好哇&#xff01;今天我们来学习ajax的get和post请求 一、了解ajax Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种在 Web 开发中用于创建交互式网页应用程序的技术。通过 Ajax&#xff0c;网页可以在不重新加载整个页面…

一文解析智慧城市,人工智能技术将成“智”理主要手段

长期以来&#xff0c;有关智慧城市的讨论主要围绕在技术进步方面&#xff0c;如自动化、人工智能、数据的公开以及将更多的传感器嵌入城市以使其更加智能化。实际上&#xff0c;智慧城市是一个关于未来的设想&#xff0c;其重要原因在于城市中存在各种基础设施、政治、地理、财…