iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >阿里四面之Spring Exception的原理解析
  • 356
分享到

阿里四面之Spring Exception的原理解析

2024-04-02 19:04:59 356人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

错误场景 验证请求的Token合法性的Filter。Token校验失败时,直接抛自定义异常,移交给spring处理: 测试Http请求: 日志输出如下:说明IllegalR

错误场景

验证请求的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 Exception的原理解析的文章就介绍到这了,更多相关Spring Exception原理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 阿里四面之Spring Exception的原理解析

本文链接: https://www.lsjlt.com/news/155338.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作