阿里四面之Spring|阿里四面之Spring Exception的原理解析
错误场景
文章图片
验证请求的Token合法性的Filter。Token校验失败时,直接抛自定义异常,移交给Spring处理:
文章图片
文章图片
文章图片
测试HTTP请求:
文章图片
日志输出如下:说明IllegalRequestExceptionHandler未生效。
文章图片
why?这就需要精通Spring异常处理流程了。
解析
文章图片
当所有Filter被执行完毕,Spring才会处理Servlet相关,而DispatcherServlet才是整个Servlet处理核心,它是前端控制器设计模式,提供 Spring Web MVC 的集中访问点并负责职责的分派。
在这,Spring处理了请求和处理器的对应关系及统一异常处理。
Filter内异常无法被统一处理,就是因为异常处理发生在 DispatcherServlet#doDispatch()
文章图片
但此时,过滤器已全部执行完。
Spring异常统一处理 ControllerAdvice如何被Spring加载并对外暴露? WebMvcConfigurationSupport#handlerExceptionResolver()
实例化并注册一个ExceptionHandlerExceptionResolver 的实例
文章图片
最终按下图调用栈,Spring 实例化了ExceptionHandlerExceptionResolver类。
文章图片
ExceptionHandlerExceptionResolver实现了InitializingBean
文章图片
重写 afterPropertiesSet()
文章图片
initExceptionHandlerAdviceCache
完成所有 ControllerAdvice 中的ExceptionHandler 初始化:查找所有 @ControllerAdvice 注解的 Bean,把它们放入exceptionHandlerAdviceCache。这里即指自定义的IllegalRequestExceptionHandler
文章图片
文章图片
所有被 @ControllerAdvice 注解的异常处理器,都会在 ExceptionHandlerExceptionResolver 实例化时自动扫描并装载在其exceptionHandlerAdviceCache。
initHandlerExceptionResolvers
当第一次请求发生时,DispatcherServlet#initHandlerExceptionResolvers() 将获取所有注册到 Spring 的 HandlerExceptionResolver 实例(ExceptionHandlerExceptionResolver正是),存到handlerExceptionResolvers
文章图片
文章图片
ControllerAdvice如何被Spring消费并处理异常? DispatcherServlet doDispatch()
文章图片
执行用户请求时,当查找、执行请求对应的 handler 过程中异常时:
会把异常值赋给 dispatchException再移交 processDispatchResult() processDispatchResult
文章图片
当Exception非空时,继续移交
processHandlerException
文章图片
从 handlerExceptionResolvers 获取有效的异常解析器以解析异常。
这里的 handlerExceptionResolvers 一定包含声明的IllegalRequestExceptionHandler#IllegalRequestException 的异常处理器的 ExceptionHandlerExceptionResolver 包装类。
修正
为利用到 Spring MVC 的异常处理机制,改造Filter:
手动捕获异常将异常通过 HandlerExceptionResolver 进行解析处理
据此,修改 PermissionFilter,注入 HandlerExceptionResolver:
文章图片
然后,在 doFilter 捕获异常并移交 HandlerExceptionResolver:
文章图片
现在再用错误 Token 请求,日志输出如下:
文章图片
响应体:
文章图片
【阿里四面之Spring|阿里四面之Spring Exception的原理解析】到此这篇关于阿里四面之Spring Exception的原理解析的文章就介绍到这了,更多相关Spring Exception原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- PMSJ寻平面设计师之现代(Hyundai)
- 太平之莲
- 闲杂“细雨”
- 七年之痒之后
- 深入理解Go之generate
- 由浅入深理解AOP
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 生活随笔|好天气下的意外之喜
- 感恩之旅第75天
- python学习之|python学习之 实现QQ自动发送消息