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

Springboot?過濾器、攔截器、全局異常處理的方案處理小結(jié)

 更新時間:2024年03月06日 10:56:46   作者:我不配擁有55kg的你  
攔截器是一種動態(tài)攔截方法調(diào)用的機制,與過濾器類似,是Spring框架中提供的,用來動態(tài)攔截控制器方法的執(zhí)行,這篇文章主要介紹了Springboot?過濾器、攔截器、全局異常處理,需要的朋友可以參考下

Springboot 過濾器、攔截器、全局異常處理

一 過濾器(Filter)

過濾器是JavaWeb三大組件(Servlet,F(xiàn)ilter,Listener)之一。

Filter可以把對資源的請求攔截下來,從而實現(xiàn)一些功能。

注意:過濾器一般用于一些通用的操作,比如登錄校驗,統(tǒng)一編碼處理,敏感字符處理等。

1.定義過濾器

1.創(chuàng)建一個類,實現(xiàn) javax.servlet.Filter接口,并且實現(xiàn)其方法。

2.配置過濾器

在類上增加 @WebFilter 注解,配置攔截資源的路徑,并且在引導(dǎo)類上增加@ServletComponentScan開啟Servlet的組件支持。

注意:Filter 是JavaWeb的組件,并非Spring組件,所以還需要在引導(dǎo)類上使用@ServletComponentScan開啟對Filter組件的支持

@WebFilter
public class CustomFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化方法,Web服務(wù)啟動創(chuàng)建Filter時調(diào)用一次??梢圆挥弥貙?
        Filter.super.init(filterConfig);
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {
        // 攔截到請求時,調(diào)用該方法。是攔截器的核心
        filterChain.doFilter(servletRequest,servletResponse);
    }
    @Override
    public void destroy() {
        // 銷毀方法,服務(wù)器關(guān)閉時調(diào)用一次,可以不重寫
        Filter.super.destroy();
    }
}

攔截器Filter的核心方法是 doFilter(),處理相關(guān)邏輯的代碼幾乎都寫在此處。

可以通過@WebFilter注解的屬性urlPatterns,來配置需要進行過濾的資源信息。

示例:使用 urlPatterns = "/*"配置過濾所有請求

@WebFilter(urlPatterns = "/*")
public class CustomFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {
        //放行對資源的請求
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

3.OncePerRequestFilter

在實際使用中推薦使用OncePerRequestFilter ,它是Spring框架提供的一個抽象類,用于確保過濾器只在每個請求中被調(diào)用一次。它繼承自

GenericFilterBean類,并在 doFilter 方法中添加了對請求是否已被過濾的判斷邏輯。

OncePerRequestFilterFilter 的根本區(qū)別在于 OncePerRequestFilter 提供了一個確保過濾器只在每個請求中被調(diào)用一次的機制,而 Filter

口本身并沒有提供這樣的機制。

@Configuration
public class JwtAuthenticationFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
            filterChain.doFilter(httpServletRequest, httpServletResponse);
        }
    }
}

而且使用OncePerRequestFilter的實現(xiàn)類,并不需要在項目的啟動類上增加@ServletComponentScan注解。

二 攔截器(Interceptor)

1.攔截器概述

攔截器是一種動態(tài)攔截方法調(diào)用的機制,與過濾器類似。是Spring框架中提供的,用來動態(tài)攔截控制器方法的執(zhí)行。

它的主要作用是攔截請求,在指定的方法前后調(diào)用,根據(jù)業(yè)務(wù)需要執(zhí)行預(yù)先設(shè)定的代碼。

2.定義攔截器(Interceptor)

定義一個攔截器,繼承HandlerInterceper,并實現(xiàn)其方法。

HandlerInterceptor中的方法都提供了默認實現(xiàn),可根據(jù)業(yè)務(wù)需求來決定重寫哪些方法。

注意要為攔截器添加@Component注解,將其交給IOC容器管理。

@Component
public class CustomInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //在目標資源方法執(zhí)行前執(zhí)行,返回true放行,false 不放行
         return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //在目標資源方法之后執(zhí)行
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //在整體請求完成之后調(diào)用
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}
  • @Component注解是Spring框架中用于表示一個類為Spring組件的通用注解,通過添加@Component注解,可以告訴Spring容器在項目初始化時將該類實例化為一個Bean,并由Spring容器管理。
  • HandlerInterceptor是SpringMVC框架中的攔截器接口,用于攔截請求的處理過程并進行響應(yīng)的處理。可以通過實現(xiàn)HandlerInterceptor類來自定義攔截器,實現(xiàn)更靈活的業(yè)務(wù)控制。

3.注冊攔截器

自定義的攔截器,需要進行注冊??蓪崿F(xiàn)WebMvcConfigurer 接口,實現(xiàn) addInterceptors方法,為其添加新的攔截器。

@Configuration
public class SpringWebConfigurer implements WebMvcConfigurer {
    //方式1:如果在定義攔截器的時候已經(jīng)添加了@Component注解,則直接使用注入的方式,將攔截器對象注冊到InterceptorRegistry對象中
    @Resource
    private CustomInterceptor customInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 使用 addPathPatterns 添加攔截路徑,支持數(shù)組
        // /**表示攔截所有資源,屬于 AntPathMatcher(螞蟻路徑匹配器)語法
        //方式1:使用注入的對象
        registry.addInterceptor(customInterceptor).addPathPatterns("/**");
        //方式2:也可以直接創(chuàng)建對象,添加到InterceptorRegistry對象中
        registry.addInterceptor(new CustomInterceptor()).addPathPatterns("/**");
    }
}
  • InterceptorRegistry是Spring框架中專門用來管理攔截器的集合類。通過InterceptorRegistry對象,可以添加攔截器。并且指定它們的執(zhí)行順序。
  • WebMvcConfigurer是Spring框架中用于配置Mvc特性的接口,通過實現(xiàn)WebMvcConfigurer接口,可以對SpringMVC進行自定義配置,包括添加攔截器,資源處理器,視圖解析器等。
  • @Configuration注解是Spring框架中用于表示配置類的注解,通過添加@Configuration注解,可以告訴Spring容器,該類是一個配置類,其中包含了一些配置信息,例如 Bean的定義,Bean之間的依賴關(guān)系,組件掃描等。
  • addPathPatterns方法用來配置需要攔截的資源路徑。
  • excludePathPatterns方法用來配置不需要攔截的資源路徑。

4.AntPathMatcher

Ant風(fēng)格的路徑模式匹配,AntPathMatcher支持以下通配符:

  • ? 匹配一個字符
  • * 匹配0個或多個字符
  • ** 匹配0個或多個目錄

5.攔截路徑

攔截路徑的簡單示意:

6.過濾器和攔截器的執(zhí)行流程

當(dāng)過濾器與攔截器同時存在時,它們的執(zhí)行流程如下:

dispatcherServlet的說明:

  • dispatcherServlet是SpringMVC框架中的一個關(guān)鍵組件,用于所有進入應(yīng)用程序的請求并將其分派到相應(yīng)的處理程序(Controller)進行處理.
  • dispatcherServlet是一個Servlet,負責(zé)接收HTTP請求并根據(jù)請求的URL,將請求分發(fā)給合適的Controller。
  • dispatcherServlet可以通過配置來定制各種行為,包括URL映射,視圖解析,異常處理等。是整個SpringMVC框架的核心,負責(zé)協(xié)調(diào)各個組件的工作,實現(xiàn)請求的處理和響應(yīng)的生成。

執(zhí)行流程說明:

  • 瀏覽器發(fā)送請求,先到過濾器(Filter)
  • 過濾器(Filter)放行之后,HTTP請求經(jīng)過dispatcherServlet的派發(fā)到達攔截器(Interceptor)
  • 攔截器(Interceptor)放行之后,請求才會真正進入處理程序(Controller)
  • 處理程序(Controller)生成響應(yīng)結(jié)果,將結(jié)果返回到攔截器(Interceptor)
  • 攔截器(Interceptor)最后再將結(jié)果返回過濾器(Filter),最后響應(yīng)給瀏覽器

7.過濾器和攔截器的區(qū)別

  • 接口規(guī)范不同:過濾器需要實現(xiàn)Filter接口;而攔截器需要實現(xiàn)HandlerInterceptor接口,并且需要注冊到InterceptorRegistry集合中。
  • 攔截范圍不同:過濾器會攔截所有的請求資源;而攔截器只會攔截Spring環(huán)境中的資源。

三 全局異常處理

定義一個類并且使用 @RestControllerAdvice 注解,則表明我們定義了一個全局異常處理類。

然后創(chuàng)建方法來捕獲異常,并且通過@ExceptionHandler注解來表明要捕獲的異常類型。并且將該異常的對象作為形參傳入方法中。

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(RuntimeException.class)
    public Result runtimeException(RuntimeException runtimeException) {
        return Result.err(runtimeException.getMessage());
    }
}

注意:Result是一個自定義的統(tǒng)一響應(yīng)格式類,其中包含了響應(yīng)代碼,響應(yīng)消息,和響應(yīng)數(shù)據(jù)。并且定義了幾個常用的靜態(tài)方法。

以上示例中,為保證返回格式統(tǒng)一,所以使用了Result作為返回類型。

  • @RestControllerAdvice:@RestControllerAdvice 用于定義一個全局的異常處理類,它結(jié)合了 @ControllerAdvice 和 @ResponseBody 兩個注解的功能。在 Spring Boot 應(yīng)用中,我們可以使用 @RestControllerAdvice 注解來統(tǒng)一處理異常,返回統(tǒng)一的錯誤信息給前端。
  • @ExceptionHandler:@ExceptionHandler 用于在 Spring MVC 控制器類中定義方法來處理特定類型的異常。當(dāng)控制器中的方法拋出指定類型的異常時,@ExceptionHandler 注解的方法會被調(diào)用來處理該異常,從而提供定制化的異常處理邏輯

到此這篇關(guān)于Springboot 過濾器、攔截器、全局異常處理的文章就介紹到這了,更多相關(guān)Springboot 過濾器、攔截器、全局異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解IDEA JUnit5測試套件運行錯誤的問題

    詳解IDEA JUnit5測試套件運行錯誤的問題

    這篇文章主要介紹了詳解IDEA JUnit5測試套件運行錯誤的問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Java用鄰接表存儲圖的示例代碼

    Java用鄰接表存儲圖的示例代碼

    鄰接表是圖的一種鏈式存儲方法,其數(shù)據(jù)結(jié)構(gòu)包括兩部分:節(jié)點和鄰接點。本文將用鄰接表實現(xiàn)存儲圖,感興趣的小伙伴可以了解一下
    2022-06-06
  • JVM的垃圾回收算法工作原理詳解

    JVM的垃圾回收算法工作原理詳解

    這篇文章主要介紹了JVM的垃圾回收算如何判斷對象是否可以被回收,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下
    2019-06-06
  • spring-boot報錯javax.servlet.http不存在的問題解決

    spring-boot報錯javax.servlet.http不存在的問題解決

    當(dāng)springboot項目從2.7.x的升級到3.0.x的時候,會遇到j(luò)avax.servlet.http不存在,本文就來介紹一下這個問題的解決,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • 解析Java圖形化編程中的文本框和文本區(qū)

    解析Java圖形化編程中的文本框和文本區(qū)

    這篇文章主要介紹了Java圖形化編程中的文本框和文本區(qū),是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • 使用JSCH框架通過跳轉(zhuǎn)機訪問其他節(jié)點的方法

    使用JSCH框架通過跳轉(zhuǎn)機訪問其他節(jié)點的方法

    下面小編就為大家分享一篇使用JSCH框架通過跳轉(zhuǎn)機訪問其他節(jié)點的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Java中Object toString方法簡介_動力節(jié)點Java學(xué)院整理

    Java中Object toString方法簡介_動力節(jié)點Java學(xué)院整理

    Object類在Java里面是一個比較特殊的類,JAVA為了組織這個類組織得比較方便,它提供了一個最根上的類,相當(dāng)于所有的類都是從這個類繼承,這個類就叫Object。接下來通過本文給大家介紹Object toString方法,需要的的朋友參考下吧
    2017-05-05
  • Spring.Net IOC依賴注入原理流程解析

    Spring.Net IOC依賴注入原理流程解析

    這篇文章主要介紹了Spring.Net IOC依賴注入原理流程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • javacv視頻抽幀的實現(xiàn)過程詳解(附代碼)

    javacv視頻抽幀的實現(xiàn)過程詳解(附代碼)

    這篇文章主要介紹了javacv視頻抽幀的實現(xiàn)過程詳解(附代碼),視頻抽幀可以做一些處理,比如水印,去水印等操作,然后再合成視頻,需要的朋友可以參考下
    2019-07-07
  • java中怎樣表示圓周率

    java中怎樣表示圓周率

    這篇文章主要介紹了java中怎樣表示圓周率問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05

最新評論

滦平县| 安化县| 龙山县| 阿鲁科尔沁旗| 十堰市| 边坝县| 景谷| 肃宁县| 驻马店市| 洛南县| 宝鸡市| 澎湖县| 库伦旗| 玉屏| 辉县市| 东阳市| 齐齐哈尔市| 桂林市| 贵港市| 平和县| 朔州市| 和政县| 青神县| 龙南县| 新晃| 绵竹市| 江西省| 太湖县| 镇巴县| 兴义市| 大庆市| 比如县| 诏安县| 祥云县| 乐安县| 万荣县| 博白县| 巴里| 恭城| 黄冈市| 砚山县|