背景:我们想对Spring的项目做一个全局拦截器,通过解析业务报文,获取到code码非成功的异常报文,同时对code码进行异常分级。搭建系统维度监控。
但是项目中,有的地方使用的是Result对象返回错误,有的用Exception来抛出异常。有的地方是在Controller返回,有的是在拦截器中抛出异常,有的是在切面中抛出异常。
所以需要搞清楚:拦截器、过滤器、全局异常捕获器、Controller、切面的执行顺序
结论
- 正常的请求
进入Filter
拦截器:Interceptor--preHandle
进入AOP切面
执行Controller
离开AOP切面
拦截器:Interceptor--postHandle
拦截器:Interceptor--afterCompletion
离开Filter
- 当Controller出现异常被全局异常捕获器捕获时(没有执行拦截器的postHandle)
进入Filter
拦截器:Interceptor--preHandle
进入AOP切面
执行Controller
离开AOP切面
进入全局异常捕获器:ControllerAdvice
拦截器:Interceptor--afterCompletion
离开Filter
- 当拦截器抛出异常,被全集异常捕获器捕获时
进入Filter
拦截器:Interceptor--preHandle
进入全局异常捕获器:ControllerAdvice
离开Filter
可以看到:
- Filter中是肯定能拿到响应报文的。但是需要对流进行处理,将其转化成可重复读的流;
- 切面可以处理正常的请求、全局异常捕获器可以处理Exception的请求,也可以完成闭环的监控解析。