SpringBoot對(duì)Filter過(guò)濾器中的異常進(jìn)行全局處理方案詳解
前言
今天處理攔截器中的異常時(shí),遇到這樣一個(gè)問(wèn)題,我們希望在過(guò)濾器中對(duì)用戶的請(qǐng)求進(jìn)行判斷,如果不符合要求直接拋出異常并在前端展示。但是如果我們直接在過(guò)濾器中throw一個(gè)異常時(shí),盡管我們使用@ControllerAdvice和 @ExceptionHandler注解注冊(cè)了全局異常處理器,但是前端是無(wú)法接收到的。
這是因?yàn)檫^(guò)濾器是在進(jìn)入Servlet之前處理請(qǐng)求的,從注解名稱也能看出來(lái)@ControllerAdvice是處理Controller層異常的,請(qǐng)求還沒(méi)到Controller層,當(dāng)然無(wú)法處理了。
那么如何將過(guò)濾器中的異常像Controller層一樣進(jìn)行全局處理呢?
一、全局異常處理
首先全局異常處理器還是不可少的,大概像下面這個(gè)樣子
@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); } }
二、處理過(guò)濾器中的異常
在我們自定義的Filter類中,使用HandlerExceptionResolver的resolveException方法來(lái)進(jìn)行處理,如下面代碼所示
@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 { //...進(jìn)行一些邏輯處理 if (...) { HandlerExceptionResolver handlerExceptionResolver = SpringContextUtil.getBean("handlerExceptionResolver"); handlerExceptionResolver.resolveException((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, null,new ServiceException("拋出過(guò)濾器全局異常!")); return; } filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } }
這樣就能實(shí)現(xiàn)效果了:
看一下后端返回的響應(yīng)數(shù)據(jù)如下:
接著我們說(shuō)說(shuō)HandlerExceptionResolver和它的resolveException方法的原理實(shí)現(xiàn)。
HandlerExceptionResolver 接口是 Spring MVC 提供的全局異常處理機(jī)制的一部分,它的原理基于 Spring MVC 框架的請(qǐng)求處理流程和異常處理機(jī)制。
當(dāng)請(qǐng)求在 Spring MVC 中的某一組件中拋出異常時(shí),異常會(huì)沿著請(qǐng)求處理的鏈路向上傳播,直到找到能夠處理異常的地方。通常,異常首先會(huì)被容器(例如,Servlet 容器)捕獲,然后傳遞給 Spring MVC 框架。Spring MVC 框架會(huì)遍歷已注冊(cè)的異常處理器,調(diào)用它們的 resolveException 方法。每個(gè)異常處理器有機(jī)會(huì)檢查異常類型,如果匹配,就執(zhí)行自定義的異常處理邏輯。
在SpringBoot中我們通過(guò) @ControllerAdvice 注解和 @ExceptionHandler注解注冊(cè)了全局異常處理器,因此resolveException方法會(huì)將異常進(jìn)行傳播給我們自定義的異常處理器,最后就能進(jìn)行全局異常處理了。
到此這篇關(guān)于SpringBoot對(duì)Filter過(guò)濾器中的異常進(jìn)行全局處理的文章就介紹到這了,更多相關(guān)SpringBoot異常全局處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 淺析SpringBoot中的過(guò)濾器和攔截器
- Springboot?過(guò)濾器、攔截器、全局異常處理的方案處理小結(jié)
- Springboot中使用攔截器、過(guò)濾器、監(jiān)聽器的流程分析
- Springboot實(shí)現(xiàn)過(guò)濾器的兩種方式
- SpringBoot實(shí)現(xiàn)過(guò)濾器Filter的三種方式
- SpringBoot項(xiàng)目如何設(shè)置權(quán)限攔截器和過(guò)濾器
- springboot應(yīng)用中使用過(guò)濾器的過(guò)程詳解
- springboot實(shí)現(xiàn)過(guò)濾器的示例代碼
相關(guān)文章
SpringBoot之自定義banner使用代碼實(shí)例
這篇文章主要介紹了SpringBoot之自定義banner使用代碼實(shí)例,在Spring Boot中,你可以通過(guò)定制Banner來(lái)個(gè)性化你的應(yīng)用程序啟動(dòng)時(shí)的輸出,Banner是一個(gè)在應(yīng)用程序啟動(dòng)時(shí)顯示的ASCII藝術(shù)字形式的標(biāo)志,用于增加應(yīng)用程序的識(shí)別度和個(gè)性化,需要的朋友可以參考下2024-01-01springboot解決Class path contains multiple 
這篇文章主要介紹了springboot解決Class path contains multiple SLF4J bindings問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07SpringBoot項(xiàng)目中連接SQL Server的三種方式
連接SQL Server是許多Spring Boot項(xiàng)目中常見(jiàn)的需求之一,本文主要介紹了SpringBoot項(xiàng)目中連接SQL Server的三種方式,具有一定的參考價(jià)值 ,感興趣的可以了解一下2023-09-09java實(shí)現(xiàn)周期性執(zhí)行(定時(shí)任務(wù))
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)周期性執(zhí)行定時(shí)任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09SpringBoot實(shí)現(xiàn)子類的反序列化示例代碼
這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)子類的反序列化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08MybatisPlus 主鍵策略的幾種實(shí)現(xiàn)方法
MybatisPlus-Plus支持多種主鍵生成策略,可以通過(guò)@TableId注解的type屬性配置,主要策略包括AUTO、INPUT、ASSING_ID、ASSING_UUID和NONE,每種策略適用于不同的場(chǎng)景,下面就來(lái)介紹一下2024-10-10Spring Cloud微服務(wù)使用webSocket的方法
WebSocket在現(xiàn)代瀏覽器中的應(yīng)用已經(jīng)算是比較普遍了,在某些業(yè)務(wù)場(chǎng)景下,要求必須能夠在服務(wù)器端推送消息至客戶端,本文給大家介紹Spring Cloud微服務(wù)使用webSocket的方法,感興趣的朋友一起看看吧2021-06-06SpringBoot3整合Druid監(jiān)控功能的項(xiàng)目實(shí)踐
Druid連接池作為一款強(qiáng)大的數(shù)據(jù)庫(kù)連接池,提供了豐富的監(jiān)控和管理功能,成為很多Java項(xiàng)目的首選,本文主要介紹了SpringBoot3整合Druid監(jiān)控功能的項(xiàng)目實(shí)踐,感興趣的可以了解一下2024-01-01MyBatis中#{}?和?${}?的區(qū)別和動(dòng)態(tài)?SQL詳解
這篇文章主要介紹了MyBatis中#{}和${}的區(qū)別,包括參數(shù)傳遞、安全性、性能等方面,然后詳細(xì)介紹了如何使用#{}和${}進(jìn)行排序、模糊查詢、動(dòng)態(tài)SQL、數(shù)據(jù)庫(kù)連接池等操作,最后,總結(jié)了注解方式的動(dòng)態(tài)SQL,感興趣的朋友跟隨小編一起看看吧2024-11-11