SpringBoot對Filter過濾器中的異常進(jìn)行全局處理方案詳解
前言
今天處理攔截器中的異常時,遇到這樣一個問題,我們希望在過濾器中對用戶的請求進(jìn)行判斷,如果不符合要求直接拋出異常并在前端展示。但是如果我們直接在過濾器中throw一個異常時,盡管我們使用@ControllerAdvice和 @ExceptionHandler注解注冊了全局異常處理器,但是前端是無法接收到的。
這是因?yàn)檫^濾器是在進(jìn)入Servlet之前處理請求的,從注解名稱也能看出來@ControllerAdvice是處理Controller層異常的,請求還沒到Controller層,當(dāng)然無法處理了。
那么如何將過濾器中的異常像Controller層一樣進(jìn)行全局處理呢?
一、全局異常處理
首先全局異常處理器還是不可少的,大概像下面這個樣子
@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方法來進(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("拋出過濾器全局異常!"));
return;
}
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}這樣就能實(shí)現(xiàn)效果了:

看一下后端返回的響應(yīng)數(shù)據(jù)如下:

接著我們說說HandlerExceptionResolver和它的resolveException方法的原理實(shí)現(xiàn)。
HandlerExceptionResolver 接口是 Spring MVC 提供的全局異常處理機(jī)制的一部分,它的原理基于 Spring MVC 框架的請求處理流程和異常處理機(jī)制。
當(dāng)請求在 Spring MVC 中的某一組件中拋出異常時,異常會沿著請求處理的鏈路向上傳播,直到找到能夠處理異常的地方。通常,異常首先會被容器(例如,Servlet 容器)捕獲,然后傳遞給 Spring MVC 框架。Spring MVC 框架會遍歷已注冊的異常處理器,調(diào)用它們的 resolveException 方法。每個異常處理器有機(jī)會檢查異常類型,如果匹配,就執(zhí)行自定義的異常處理邏輯。
在SpringBoot中我們通過 @ControllerAdvice 注解和 @ExceptionHandler注解注冊了全局異常處理器,因此resolveException方法會將異常進(jìn)行傳播給我們自定義的異常處理器,最后就能進(jìn)行全局異常處理了。
到此這篇關(guān)于SpringBoot對Filter過濾器中的異常進(jìn)行全局處理的文章就介紹到這了,更多相關(guān)SpringBoot異常全局處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
獲取Java的MyBatis框架項目中的SqlSession的方法
SqlSession中包括已經(jīng)映射好的SQL語句,這樣對象實(shí)例就可以直接拿過來用了,那么這里就來講解獲取Java的MyBatis框架項目中的SqlSession的方法2016-06-06
Java實(shí)現(xiàn)冒泡排序與雙向冒泡排序算法的代碼示例
這篇文章主要介紹了Java實(shí)現(xiàn)冒泡排序與雙向冒泡排序算法的代碼示例,值得一提的是所謂的雙向冒泡排序并不比普通的冒泡排序效率來得高,注意相應(yīng)的時間復(fù)雜度,需要的朋友可以參考下2016-04-04
Java實(shí)現(xiàn)Word轉(zhuǎn)PDF的兩種常見方案和性能實(shí)測
這篇文章對比了Java后端開發(fā)中Word轉(zhuǎn)PDF的兩種常見方案,即docx4j(純Java實(shí)現(xiàn))和LibreOffice(調(diào)用Office原生引擎),下面小編就和大家詳細(xì)介紹一下具體實(shí)現(xiàn)方法吧2026-01-01
Java?SM2加密相關(guān)實(shí)現(xiàn)與簡單原理詳解
SM2算法可以用較少的計算能力提供比RSA算法更高的安全強(qiáng)度,而所需的密鑰長度卻遠(yuǎn)比RSA算法低,這篇文章主要給大家介紹了關(guān)于Java?SM2加密相關(guān)實(shí)現(xiàn)與簡單原理的相關(guān)資料,需要的朋友可以參考下2024-01-01
SpringBoot接口返回日期格式化的3種方法實(shí)現(xiàn)與對比
這篇文章主要為大家詳細(xì)介紹了SpringBoot中接口返回日期格式化的3種方法實(shí)現(xiàn)與對比,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-09-09

