处理filter里抛出的异常

 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值