SpringBoot对Filter过滤器中的异常进行全局处理

前言

今天处理拦截器中的异常时,遇到这样一个问题,我们希望在过滤器中对用户的请求进行判断,如果不符合要求直接抛出异常并在前端展示。但是如果我们直接在过滤器中throw一个异常时,尽管我们使用@ControllerAdvice和 @ExceptionHandler注解注册了全局异常处理器,但是前端是无法接收到的。

这是因为过滤器是在进入Servlet之前处理请求的,从注解名称也能看出来@ControllerAdvice是处理Controller层异常的,请求还没到Controller层,当然无法处理了。

那么如何将过滤器中的异常像Controller层一样进行全局处理呢?

一、全局异常处理

首先全局异常处理器还是不可少的,大概像下面这个样子

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(value = ServiceException.class)@ResponseBodypublic ResponseEntity<AjaxResponse> serviceExceptionHandler(ServiceException e, HttpServletRequest request){//...处理一些逻辑return new ResponseEntity<>(new AjaxResponse().failure(Constants.ErrorCode.SERVICE_ERROR,e.getMessage()), HttpStatus.BAD_REQUEST);}
}

二、处理过滤器中的异常

在我们自定义的Filter类中,使用HandlerExceptionResolver的resolveException方法来进行处理,如下面代码所示

@Component
public class MyFilter implements Filter {@Overridepublic void init(javax.servlet.FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//...进行一些逻辑处理if (...) {HandlerExceptionResolver handlerExceptionResolver = SpringContextUtil.getBean("handlerExceptionResolver");handlerExceptionResolver.resolveException((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse,null,new ServiceException("抛出过滤器全局异常!"));return;}filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {}
}

这样就能实现效果了:

在这里插入图片描述

看一下后端返回的响应数据如下:

在这里插入图片描述

接着我们说说HandlerExceptionResolver和它的resolveException方法的原理实现。

HandlerExceptionResolver 接口是 Spring MVC 提供的全局异常处理机制的一部分,它的原理基于 Spring MVC 框架的请求处理流程和异常处理机制。

当请求在 Spring MVC 中的某一组件中抛出异常时,异常会沿着请求处理的链路向上传播,直到找到能够处理异常的地方。通常,异常首先会被容器(例如,Servlet 容器)捕获,然后传递给 Spring MVC 框架。Spring MVC 框架会遍历已注册的异常处理器,调用它们的 resolveException 方法。每个异常处理器有机会检查异常类型,如果匹配,就执行自定义的异常处理逻辑。

在SpringBoot中我们通过 @ControllerAdvice 注解和 @ExceptionHandler注解注册了全局异常处理器,因此resolveException方法会将异常进行传播给我们自定义的异常处理器,最后就能进行全局异常处理了。

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

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

相关文章

再见纸质档案!电子会计档案数字化建设,为企业持续创造价值

传统的会计档案工作需要依靠纸张存储&#xff0c;对存储的空间大小、温度和湿度都有要求&#xff0c;财务人员要人工完成所有归档工作&#xff0c;档案在采集、调阅、借阅的过程中也易发生损坏、丢失等情况&#xff0c;企业需要付出高额的管理成本&#xff0c;不仅给财务人员带…

【IoT】生产制造:锅仔片上机做 SMT 加工吗?

目录 简介 锅仔片 简介 由于最近做产品用到了锅仔按键&#xff0c;由于单品用量过多&#xff0c;但是成品锅仔按键价格又太高&#xff0c;不适合量产。 这个时候就想到了锅仔片&#xff0c;问题又来了&#xff0c;锅仔片是否可以上机呢&#xff1f; 答案是肯定的。 锅仔片…

Spring实例化源码解析(二)

ConfigurationClassPostProcessor源码 解析 书接上回&#xff0c;在第一次调用invokeBeanDefinitionRegistryPostProcessors方法的时候参数currentRegistryProcessors为ConfigurationClassPostProcessor&#xff0c;本章主要深入这个类的postProcessBeanDefinitionRegistry方法…

B树的定义和特点

1.多叉查找树的效率 策略1:m叉查找树中&#xff0c;规定除了根节点外&#xff0c;任何结点至少有[m/2]个分叉&#xff0c;即至少含有[m/2]-1个关键字。策略2:m叉查找树中&#xff0c;规定对于任何一个结点&#xff0c;其所有子树的高度都要相同。 而满足以上两种策略的树被称…

halcon算子2、gray_histo

gray_histo 计算直方图 原形&#xff1a;gray_histo(Regions, Image : : : AbsoluteHisto, RelativeHisto) 功能&#xff1a;计算直方图 参数&#xff1a;Regions&#xff1a;区域&#xff0c;要计算的区域&#xff08;在image上的区域&#xff09; Image &#xff1a;要计算的…

【算法】迷宫问题

文章目录 前言1.迷宫问题求解分步骤求解代码 2.迷宫最短路径求解代码 前言 迷宫问题本质就是一个图的遍历问题&#xff0c;从起点开始不断四个方向探索&#xff0c;直到走到出口&#xff0c;走的过程中我们借助栈记录走过路径的坐标。 栈记录坐标有两方面的作用&#xff0c;一…

Git配置SSH

前言&#xff1a; Git是分布式的代码管理工具&#xff0c;远程的代码管理是基于SSH的&#xff0c;所以要使用远程的Git则需要SSH的配置 温馨提示&#xff1a; 1.查看是否已经有了ssh公钥&#xff1a;cd ~/.ssh 如果没有则不会有此文件夹&#xff0c;有则删除 一、git 配置 &a…

【HarmonyOS】【DevEco Studio】盘点DevEco Studio日志获取途径

【关键词】 DevEco Studio、日志获取 【问题背景】 在收到IDE工单的时候&#xff0c;很多时候开发者出现的问题都需要提供一些日志&#xff0c;然后根据日志分析&#xff0c;那么你知道IDE各种日志的获取方式么&#xff1f;往下看 【获取方法】 一、idea.log获取 IDE界面H…

【数据结构】二叉树的层序遍历(四)

目录 一&#xff0c;层序遍历概念 二&#xff0c;层序遍历的实现 1&#xff0c;层序遍历的实现思路 2&#xff0c;创建队列 Queue.h Queue.c 3&#xff0c;创建二叉树 BTree.h BTree.c 4&#xff0c;层序遍历的实现 一&#xff0c;层序遍历概念 层序遍历&#xff1a;除了先序…

大模型助力企业数据驱动,火山引擎数智平台发布AI助手

9月19日&#xff0c;火山引擎在其举办的“V-Tech数据驱动科技峰会”上宣布&#xff0c;火山引擎数智平台VeDI推出“AI助手”&#xff0c;通过接入人工智能大模型&#xff0c;帮助企业提升数据处理和查询分析的效率。即使是不会写代码的运营人员&#xff0c;和大模型对话也能做好…

基于conda的相关命令

conda 查看python版本环境 打开Anaconda Prompt的命令输入框 查看自己的python版本 conda env list激活相应的python版本(环境&#xff09; conda avtivate python_3.9 若输入以下命令可查看python版本 python -V #注意V是大写安装相应的包 pip install 包名5.查看已安装…

stm32----ADC模数转换

一、ADC介绍 ADC&#xff0c;即模数转换器&#xff0c;它可以将模拟信号转化为数字信号。在stm32种一般有3个ADC&#xff0c;每个ADC有18个通道。 12位ADC是一种逐次逼近型模拟数字转换器&#xff0c;它有多达18个通道&#xff0c;可测量16个外部和两个内部信号源。各个通道的A…

物 理 层

二、物理层 1、物理层的基本概念 物理层的作用:尽可能的屏蔽掉传输媒体和通信手段的差异&#xff0c;使物理层上面的数据链路层感觉不到这些差异&#xff0c;使其只需要考虑如何完成本层的协议和服务 1.1、物理层的主要任务 机械特性&#xff1a;指明接口所用的接线器的形状…

Windows10/11无线网卡WIFI驱动详细下载安装教程

官网下载WIFI驱动 《intel官网》 找到下载Windows 10 and Windows 11* WiFi package drivers 查看详细信息 下载对应操作系统的WIFI驱动 安装驱动&#xff0c;然后重启电脑即可。

掌动智能浅谈UI自动化测试工具的重要性

在现代软件开发中&#xff0c;用户界面(UI)的质量和可靠性对于一个应用的成功至关重要。为了确保应用在各种环境和设备上都能正常运行&#xff0c;开发团队需要进行全面的UI测试。为了提高测试效率和减少人为错误&#xff0c;UI自动化测试工具成为不可或缺的工具。本文将探讨UI…

解决Python中的JSON序列化Bug TypeError: Object of type ‘int64‘ is not JSON serializable

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

uni-app:实现条件判断展示图片(函数判定+三目运算)

一、多条件判断&#xff08;通过函数进行图片展示&#xff09; 效果 代码 在data中定义图片信息和要传递的数据信息&#xff0c;在src中写入函数并携带要传递的数据&#xff0c;通过传递的数据在函数中进行判断&#xff0c;并返回对应的图片信息 <template><view&…

安防监控系统/视频云存储EasyCVR平台视频无法播放是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

Hadoop:YARN、MapReduce、Hive操作

目录 分布式计算概述 YARN概述 YARN架构 核心架构 辅助架构 MapReduce 概述 配置相关文件 提交MapReduce到YARN Hive Hive架构 Hive在VMware部署 Hive的启动 数据库操作 数据表操作 内部表操作 外部表操作 数据加载和导出 数据加载LOAD 数据加载 - INSERT SEL…

QT--day3

2> 完成文本编辑器的保存工作 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }void Widget::on_fontbtn_cl…