一文搞懂拦截器、过滤器、全局异常捕获器、Controller、切面的执行顺序

背景:我们想对Spring的项目做一个全局拦截器,通过解析业务报文,获取到code码非成功的异常报文,同时对code码进行异常分级。搭建系统维度监控。

但是项目中,有的地方使用的是Result对象返回错误,有的用Exception来抛出异常。有的地方是在Controller返回,有的是在拦截器中抛出异常,有的是在切面中抛出异常。

所以需要搞清楚:拦截器、过滤器、全局异常捕获器、Controller、切面的执行顺序

结论

  1. 正常的请求
进入Filter
拦截器:Interceptor--preHandle
进入AOP切面
执行Controller
离开AOP切面
拦截器:Interceptor--postHandle
拦截器:Interceptor--afterCompletion
离开Filter
  1. 当Controller出现异常被全局异常捕获器捕获时(没有执行拦截器的postHandle)
进入Filter
拦截器:Interceptor--preHandle
进入AOP切面
执行Controller
离开AOP切面
进入全局异常捕获器:ControllerAdvice
拦截器:Interceptor--afterCompletion
离开Filter
  1. 当拦截器抛出异常,被全集异常捕获器捕获时
进入Filter
拦截器:Interceptor--preHandle
进入全局异常捕获器:ControllerAdvice
离开Filter

可以看到:

  1. Filter中是肯定能拿到响应报文的。但是需要对流进行处理,将其转化成可重复读的流;
  2. 切面可以处理正常的请求、全局异常捕获器可以处理Exception的请求,也可以完成闭环的监控解析。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容