全局异常处理,可以捕捉到过滤器中的异常吗?
全局异常处理器(如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