SpringBoot對Filter過濾器中的異常進行全局處理方案詳解
前言
今天處理攔截器中的異常時,遇到這樣一個問題,我們希望在過濾器中對用戶的請求進行判斷,如果不符合要求直接拋出異常并在前端展示。但是如果我們直接在過濾器中throw一個異常時,盡管我們使用@ControllerAdvice和 @ExceptionHandler注解注冊了全局異常處理器,但是前端是無法接收到的。
這是因為過濾器是在進入Servlet之前處理請求的,從注解名稱也能看出來@ControllerAdvice是處理Controller層異常的,請求還沒到Controller層,當然無法處理了。
那么如何將過濾器中的異常像Controller層一樣進行全局處理呢?
一、全局異常處理
首先全局異常處理器還是不可少的,大概像下面這個樣子
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = ServiceException.class) @ResponseBody public 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 { @Override public void init(javax.servlet.FilterConfig filterConfig) throws ServletException { } @Override public 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); } @Override public void destroy() { } }
這樣就能實現(xiàn)效果了:
看一下后端返回的響應數(shù)據(jù)如下:
接著我們說說HandlerExceptionResolver和它的resolveException方法的原理實現(xiàn)。
HandlerExceptionResolver 接口是 Spring MVC 提供的全局異常處理機制的一部分,它的原理基于 Spring MVC 框架的請求處理流程和異常處理機制。
當請求在 Spring MVC 中的某一組件中拋出異常時,異常會沿著請求處理的鏈路向上傳播,直到找到能夠處理異常的地方。通常,異常首先會被容器(例如,Servlet 容器)捕獲,然后傳遞給 Spring MVC 框架。Spring MVC 框架會遍歷已注冊的異常處理器,調用它們的 resolveException 方法。每個異常處理器有機會檢查異常類型,如果匹配,就執(zhí)行自定義的異常處理邏輯。
在SpringBoot中我們通過 @ControllerAdvice 注解和 @ExceptionHandler注解注冊了全局異常處理器,因此resolveException方法會將異常進行傳播給我們自定義的異常處理器,最后就能進行全局異常處理了。
到此這篇關于SpringBoot對Filter過濾器中的異常進行全局處理的文章就介紹到這了,更多相關SpringBoot異常全局處理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot解決Class path contains multiple 
這篇文章主要介紹了springboot解決Class path contains multiple SLF4J bindings問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07SpringBoot項目中連接SQL Server的三種方式
連接SQL Server是許多Spring Boot項目中常見的需求之一,本文主要介紹了SpringBoot項目中連接SQL Server的三種方式,具有一定的參考價值 ,感興趣的可以了解一下2023-09-09SpringBoot3整合Druid監(jiān)控功能的項目實踐
Druid連接池作為一款強大的數(shù)據(jù)庫連接池,提供了豐富的監(jiān)控和管理功能,成為很多Java項目的首選,本文主要介紹了SpringBoot3整合Druid監(jiān)控功能的項目實踐,感興趣的可以了解一下2024-01-01MyBatis中#{}?和?${}?的區(qū)別和動態(tài)?SQL詳解
這篇文章主要介紹了MyBatis中#{}和${}的區(qū)別,包括參數(shù)傳遞、安全性、性能等方面,然后詳細介紹了如何使用#{}和${}進行排序、模糊查詢、動態(tài)SQL、數(shù)據(jù)庫連接池等操作,最后,總結了注解方式的動態(tài)SQL,感興趣的朋友跟隨小編一起看看吧2024-11-11