最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年10月25日 10:28:28   作者:JavaEdge.  
本文給大家介紹阿里四面之Spring Exception的原理解析,本文通過(guò)錯(cuò)誤場(chǎng)景分析給大家詳細(xì)介紹Spring異常處理流程,感興趣的朋友一起看看吧

錯(cuò)誤場(chǎng)景

驗(yàn)證請(qǐng)求的Token合法性的Filter。Token校驗(yàn)失敗時(shí),直接拋?zhàn)远x異常,移交給Spring處理:

測(cè)試HTTP請(qǐng)求:

日志輸出如下:說(shuō)明IllegalRequestExceptionHandler未生效。

why?這就需要精通Spring異常處理流程了。

解析

當(dāng)所有Filter被執(zhí)行完畢,Spring才會(huì)處理Servlet相關(guān),而DispatcherServlet才是整個(gè)Servlet處理核心,它是前端控制器設(shè)計(jì)模式,提供 Spring Web MVC 的集中訪問(wèn)點(diǎn)并負(fù)責(zé)職責(zé)的分派。

在這,Spring處理了請(qǐng)求和處理器的對(duì)應(yīng)關(guān)系及統(tǒng)一異常處理。

Filter內(nèi)異常無(wú)法被統(tǒng)一處理,就是因?yàn)楫惓L幚戆l(fā)生在 DispatcherServlet#doDispatch()

但此時(shí),過(guò)濾器已全部執(zhí)行完。

Spring異常統(tǒng)一處理 ControllerAdvice如何被Spring加載并對(duì)外暴露? WebMvcConfigurationSupport#handlerExceptionResolver()

實(shí)例化并注冊(cè)一個(gè)ExceptionHandlerExceptionResolver 的實(shí)例

最終按下圖調(diào)用棧,Spring 實(shí)例化了ExceptionHandlerExceptionResolver類。

ExceptionHandlerExceptionResolver實(shí)現(xiàn)了InitializingBean

 

重寫 afterPropertiesSet()

initExceptionHandlerAdviceCache

完成所有 ControllerAdvice 中的ExceptionHandler 初始化:查找所有 @ControllerAdvice 注解的 Bean,把它們放入exceptionHandlerAdviceCache。這里即指自定義的IllegalRequestExceptionHandler

所有被 @ControllerAdvice 注解的異常處理器,都會(huì)在 ExceptionHandlerExceptionResolver 實(shí)例化時(shí)自動(dòng)掃描并裝載在其exceptionHandlerAdviceCache。

initHandlerExceptionResolvers

當(dāng)?shù)谝淮握?qǐng)求發(fā)生時(shí),DispatcherServlet#initHandlerExceptionResolvers() 將獲取所有注冊(cè)到 Spring 的 HandlerExceptionResolver 實(shí)例(ExceptionHandlerExceptionResolver正是),存到handlerExceptionResolvers

ControllerAdvice如何被Spring消費(fèi)并處理異常? DispatcherServlet doDispatch()

執(zhí)行用戶請(qǐng)求時(shí),當(dāng)查找、執(zhí)行請(qǐng)求對(duì)應(yīng)的 handler 過(guò)程中異常時(shí):

會(huì)把異常值賦給 dispatchException再移交 processDispatchResult() processDispatchResult

當(dāng)Exception非空時(shí),繼續(xù)移交

processHandlerException

從 handlerExceptionResolvers 獲取有效的異常解析器以解析異常。

這里的 handlerExceptionResolvers 一定包含聲明的IllegalRequestExceptionHandler#IllegalRequestException 的異常處理器的 ExceptionHandlerExceptionResolver 包裝類。

修正

為利用到 Spring MVC 的異常處理機(jī)制,改造Filter:

手動(dòng)捕獲異常將異常通過(guò) HandlerExceptionResolver 進(jìn)行解析處理

據(jù)此,修改 PermissionFilter,注入 HandlerExceptionResolver:

然后,在 doFilter 捕獲異常并移交 HandlerExceptionResolver:

現(xiàn)在再用錯(cuò)誤 Token 請(qǐng)求,日志輸出如下:

響應(yīng)體:

到此這篇關(guān)于阿里四面之Spring Exception的原理解析的文章就介紹到這了,更多相關(guān)Spring Exception原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring boot+spring cache實(shí)現(xiàn)兩級(jí)緩存(redis+caffeine)

    spring boot+spring cache實(shí)現(xiàn)兩級(jí)緩存(redis+caffeine)

    這篇文章主要介紹了spring boot+spring cache實(shí)現(xiàn)兩級(jí)緩存(redis+caffeine),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • 深入理解SpringBoot?最大連接數(shù)及最大并發(fā)數(shù)

    深入理解SpringBoot?最大連接數(shù)及最大并發(fā)數(shù)

    SpringBoot能支持的最大并發(fā)量主要看其對(duì)Tomcat的設(shè)置,可以在配置文件中對(duì)其進(jìn)行更改,本文就來(lái)介紹一下SpringBoot?最大連接數(shù)及最大并發(fā)數(shù),感興趣的可以了解一下
    2023-08-08
  • Java?Stream?流中?Collectors.toMap?的用法詳解

    Java?Stream?流中?Collectors.toMap?的用法詳解

    這篇文章主要介紹了Stream?流中?Collectors.toMap?的用法,Collectors.toMap()方法是把List轉(zhuǎn)Map的操作,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • 淺談java安全編碼指南之死鎖dead lock

    淺談java安全編碼指南之死鎖dead lock

    java中為了保證共享數(shù)據(jù)的安全性,我們引入了鎖的機(jī)制。有了鎖就有可能產(chǎn)生死鎖。死鎖的原因就是多個(gè)線程鎖住了對(duì)方所需要的資源,然后現(xiàn)有的資源又沒有釋放,從而導(dǎo)致循環(huán)等待的情況。通常來(lái)說(shuō)如果不同的線程對(duì)加鎖和釋放鎖的順序不一致的話,就很有可能產(chǎn)生死鎖。
    2021-06-06
  • Java計(jì)算字符串公式的方式解讀

    Java計(jì)算字符串公式的方式解讀

    這篇文章主要介紹了Java計(jì)算字符串公式的方式解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 使用棧的迷宮算法java版代碼

    使用棧的迷宮算法java版代碼

    這篇文章主要為大家詳細(xì)介紹了使用棧的迷宮算法java版代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Spring Security登錄添加驗(yàn)證碼的實(shí)現(xiàn)過(guò)程

    Spring Security登錄添加驗(yàn)證碼的實(shí)現(xiàn)過(guò)程

    這篇文章主要介紹了Spring Security登錄添加驗(yàn)證碼的實(shí)現(xiàn)過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 利用Java Set 去除重復(fù)object的方法

    利用Java Set 去除重復(fù)object的方法

    下面小編就為大家?guī)?lái)一篇利用Java Set 去除重復(fù)object的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • Java生態(tài)/Redis中使用Lua腳本的過(guò)程

    Java生態(tài)/Redis中使用Lua腳本的過(guò)程

    這篇文章主要介紹了Java生態(tài)/Redis中如何使用Lua腳本,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • idea如何查看安裝插件的位置

    idea如何查看安裝插件的位置

    這篇文章主要介紹了idea如何查看安裝插件的位置問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06

最新評(píng)論

肥城市| 轮台县| 乌兰察布市| 南溪县| 区。| 吉林省| 车险| 华池县| 晋中市| 清水县| 喀喇沁旗| 泾源县| 陆川县| 蒙山县| 苍溪县| 宜都市| 信阳市| 公安县| 图片| 阿合奇县| 台北县| 兴化市| 三穗县| 和林格尔县| 永和县| 信宜市| 全南县| 绥江县| 新民市| 当阳市| 泾阳县| 桦南县| 揭东县| 朝阳县| 柘荣县| 察隅县| 循化| 崇礼县| 江山市| 临邑县| 玉龙|