全局異常處理,可以捕捉到過濾器中的異常嗎?
全局異常處理器(如Spring的@ControllerAdvice
+@ExceptionHandler
)默認無法直接捕獲過濾器(Filter)中拋出的異常,這是由過濾器和Spring MVC的執行順序及職責邊界決定的。具體原因和解決方案如下:
一、為什么全局異常處理器默認捕獲不到過濾器中的異常?
-
執行順序差異:
過濾器(Filter)屬于Servlet規范,運行在Spring MVC容器之外,是Web容器(如Tomcat)直接管理的組件。其執行順序早于Spring MVC的DispatcherServlet:客戶端請求 → 過濾器(Filter) → DispatcherServlet → Spring MVC控制器(Controller) → 業務層
全局異常處理器(
@ControllerAdvice
)是Spring MVC的組件,僅能處理DispatcherServlet之后(如Controller、Service)拋出的異常,無法覆蓋過濾器階段的異常。 -
異常傳遞邊界:
過濾器中拋出的異常若未被自身捕獲,會直接被Web容器(如Tomcat)捕獲,不會進入Spring MVC的異常處理流程,因此全局異常處理器無法感知。
二、如何讓過濾器中的異常被捕獲并統一處理?
需通過“過濾器內捕獲異常 + 手動傳遞給Spring異常處理器”的方式實現,具體步驟如下:
1. 在過濾器中捕獲異常,并封裝為特定格式
public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, Filter