Filter 的异常是在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter()这里扔出来的。 Filter是tomcat负责调用执行的,所以会比 servlet(尤其是SpringMVC 的dispatcherServlet )先执行, 所以 Filter 里的错误,无法使用 @ControllerAdvice+@ExceptionHandler 进行处理。 最终是会被org.apache.catalina.core.StandardWrapperValve#invoke(Request, Response) 捕获,执行[212行代码]exception(request, response, e); 给response填充status=500,后面会根据这个status查询对应的errorPage对象。 最终会被org.apache.catalina.core.StandardHostValve#status(Request, Response) 进行处理, 因为没有 500对应的 errorPage,所以 在StandardHostValve 的217行context.findErrorPage(0) 使用 status=0 来查找; 会找到ErrorPage对象,ErrorCode[errorCode=0,location=/error], 再继续执行的话,就会执行到 custom()方法里,进行 377行代码的 rd.forward(request.getRequest(), response.getResponse()); 就会转到 springMVC 提供的 BasicErrorController里 errorHtml() 或者 error()进行处理了, 所以,最终返回 springMVC 包装的信息 { "timestamp": "2024-08-16T04:06:53.701+00:00", "status": 500, "error": "Internal Server Error", "path": "XXXX" } 一转入到 /error,则就会进入servlet体系了,就会走 dispatcherServlet了, 就会走 Interceptor了,就是走springMVC 的一些列东西了 也验证了 ,Interceptor 在 Filter 后面 调用执行的。 结论: 所以::要处理filter里抛出来的异常,需要使用ErrorController
11-10
2169