欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot對(duì)Filter過(guò)濾器中的異常進(jìn)行全局處理方案詳解

 更新時(shí)間:2023年09月27日 11:11:45   作者:lans_g  
這篇文章主要介紹了SpringBoot對(duì)Filter過(guò)濾器中的異常進(jìn)行全局處理,在SpringBoot中我們通過(guò) @ControllerAdvice 注解和 @ExceptionHandler注解注冊(cè)了全局異常處理器,需要的朋友可以參考下

前言

今天處理攔截器中的異常時(shí),遇到這樣一個(gè)問(wèn)題,我們希望在過(guò)濾器中對(duì)用戶的請(qǐng)求進(jìn)行判斷,如果不符合要求直接拋出異常并在前端展示。但是如果我們直接在過(guò)濾器中throw一個(gè)異常時(shí),盡管我們使用@ControllerAdvice和 @ExceptionHandler注解注冊(cè)了全局異常處理器,但是前端是無(wú)法接收到的。

這是因?yàn)檫^(guò)濾器是在進(jìn)入Servlet之前處理請(qǐng)求的,從注解名稱也能看出來(lái)@ControllerAdvice是處理Controller層異常的,請(qǐng)求還沒(méi)到Controller層,當(dāng)然無(wú)法處理了。

那么如何將過(guò)濾器中的異常像Controller層一樣進(jìn)行全局處理呢?

一、全局異常處理

首先全局異常處理器還是不可少的,大概像下面這個(gè)樣子

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(value = ServiceException.class)
    @ResponseBody
    public ResponseEntity<AjaxResponse> serviceExceptionHandler(ServiceException e, HttpServletRequest request){
        //...處理一些邏輯
        return new ResponseEntity<>(new AjaxResponse().failure(Constants.ErrorCode.SERVICE_ERROR,e.getMessage()), HttpStatus.BAD_REQUEST);
    }
}

二、處理過(guò)濾器中的異常

在我們自定義的Filter類中,使用HandlerExceptionResolver的resolveException方法來(lái)進(jìn)行處理,如下面代碼所示

@Component
public class MyFilter implements Filter {
    @Override
    public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            //...進(jìn)行一些邏輯處理
        	if (...) {
                HandlerExceptionResolver handlerExceptionResolver = SpringContextUtil.getBean("handlerExceptionResolver");
                handlerExceptionResolver.resolveException((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse,
                        null,new ServiceException("拋出過(guò)濾器全局異常!"));
                return;
            }
        filterChain.doFilter(servletRequest, servletResponse);
    }
    @Override
    public void destroy() {
    }
}

這樣就能實(shí)現(xiàn)效果了:

看一下后端返回的響應(yīng)數(shù)據(jù)如下:

接著我們說(shuō)說(shuō)HandlerExceptionResolver和它的resolveException方法的原理實(shí)現(xiàn)。

HandlerExceptionResolver 接口是 Spring MVC 提供的全局異常處理機(jī)制的一部分,它的原理基于 Spring MVC 框架的請(qǐng)求處理流程和異常處理機(jī)制。

當(dāng)請(qǐng)求在 Spring MVC 中的某一組件中拋出異常時(shí),異常會(huì)沿著請(qǐng)求處理的鏈路向上傳播,直到找到能夠處理異常的地方。通常,異常首先會(huì)被容器(例如,Servlet 容器)捕獲,然后傳遞給 Spring MVC 框架。Spring MVC 框架會(huì)遍歷已注冊(cè)的異常處理器,調(diào)用它們的 resolveException 方法。每個(gè)異常處理器有機(jī)會(huì)檢查異常類型,如果匹配,就執(zhí)行自定義的異常處理邏輯。

在SpringBoot中我們通過(guò) @ControllerAdvice 注解和 @ExceptionHandler注解注冊(cè)了全局異常處理器,因此resolveException方法會(huì)將異常進(jìn)行傳播給我們自定義的異常處理器,最后就能進(jìn)行全局異常處理了。

到此這篇關(guān)于SpringBoot對(duì)Filter過(guò)濾器中的異常進(jìn)行全局處理的文章就介紹到這了,更多相關(guān)SpringBoot異常全局處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot之自定義banner使用代碼實(shí)例

    SpringBoot之自定義banner使用代碼實(shí)例

    這篇文章主要介紹了SpringBoot之自定義banner使用代碼實(shí)例,在Spring Boot中,你可以通過(guò)定制Banner來(lái)個(gè)性化你的應(yīng)用程序啟動(dòng)時(shí)的輸出,Banner是一個(gè)在應(yīng)用程序啟動(dòng)時(shí)顯示的ASCII藝術(shù)字形式的標(biāo)志,用于增加應(yīng)用程序的識(shí)別度和個(gè)性化,需要的朋友可以參考下
    2024-01-01
  • springboot解決Class path contains multiple SLF4J bindings問(wèn)題

    springboot解決Class path contains multiple 

    這篇文章主要介紹了springboot解決Class path contains multiple SLF4J bindings問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot項(xiàng)目中連接SQL Server的三種方式

    SpringBoot項(xiàng)目中連接SQL Server的三種方式

    連接SQL Server是許多Spring Boot項(xiàng)目中常見(jiàn)的需求之一,本文主要介紹了SpringBoot項(xiàng)目中連接SQL Server的三種方式,具有一定的參考價(jià)值 ,感興趣的可以了解一下
    2023-09-09
  • java實(shí)現(xiàn)周期性執(zhí)行(定時(shí)任務(wù))

    java實(shí)現(xiàn)周期性執(zhí)行(定時(shí)任務(wù))

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)周期性執(zhí)行定時(shí)任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • SpringBoot實(shí)現(xiàn)子類的反序列化示例代碼

    SpringBoot實(shí)現(xiàn)子類的反序列化示例代碼

    這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)子類的反序列化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • MybatisPlus 主鍵策略的幾種實(shí)現(xiàn)方法

    MybatisPlus 主鍵策略的幾種實(shí)現(xiàn)方法

    MybatisPlus-Plus支持多種主鍵生成策略,可以通過(guò)@TableId注解的type屬性配置,主要策略包括AUTO、INPUT、ASSING_ID、ASSING_UUID和NONE,每種策略適用于不同的場(chǎng)景,下面就來(lái)介紹一下
    2024-10-10
  • Spring Cloud微服務(wù)使用webSocket的方法

    Spring Cloud微服務(wù)使用webSocket的方法

    WebSocket在現(xiàn)代瀏覽器中的應(yīng)用已經(jīng)算是比較普遍了,在某些業(yè)務(wù)場(chǎng)景下,要求必須能夠在服務(wù)器端推送消息至客戶端,本文給大家介紹Spring Cloud微服務(wù)使用webSocket的方法,感興趣的朋友一起看看吧
    2021-06-06
  • SpringBoot3整合Druid監(jiān)控功能的項(xiàng)目實(shí)踐

    SpringBoot3整合Druid監(jiān)控功能的項(xiàng)目實(shí)踐

    Druid連接池作為一款強(qiáng)大的數(shù)據(jù)庫(kù)連接池,提供了豐富的監(jiān)控和管理功能,成為很多Java項(xiàng)目的首選,本文主要介紹了SpringBoot3整合Druid監(jiān)控功能的項(xiàng)目實(shí)踐,感興趣的可以了解一下
    2024-01-01
  • java自定義JDBC實(shí)現(xiàn)連接池

    java自定義JDBC實(shí)現(xiàn)連接池

    本文主要介紹了java自定義JDBC實(shí)現(xiàn)連接池,包含實(shí)現(xiàn)JDBC連接池以及SQLException?異常的處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • MyBatis中#{}?和?${}?的區(qū)別和動(dòng)態(tài)?SQL詳解

    MyBatis中#{}?和?${}?的區(qū)別和動(dòng)態(tài)?SQL詳解

    這篇文章主要介紹了MyBatis中#{}和${}的區(qū)別,包括參數(shù)傳遞、安全性、性能等方面,然后詳細(xì)介紹了如何使用#{}和${}進(jìn)行排序、模糊查詢、動(dòng)態(tài)SQL、數(shù)據(jù)庫(kù)連接池等操作,最后,總結(jié)了注解方式的動(dòng)態(tài)SQL,感興趣的朋友跟隨小編一起看看吧
    2024-11-11

最新評(píng)論