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

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

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

Springboot 過(guò)濾器、攔截器、全局異常處理

一 過(guò)濾器(Filter)

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

Filter可以把對(duì)資源的請(qǐng)求攔截下來(lái),從而實(shí)現(xiàn)一些功能。

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

1.定義過(guò)濾器

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

2.配置過(guò)濾器

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

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

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

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

可以通過(guò)@WebFilter注解的屬性urlPatterns,來(lái)配置需要進(jìn)行過(guò)濾的資源信息。

示例:使用 urlPatterns = "/*"配置過(guò)濾所有請(qǐng)求

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

3.OncePerRequestFilter

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

GenericFilterBean類,并在 doFilter 方法中添加了對(duì)請(qǐng)求是否已被過(guò)濾的判斷邏輯。

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

口本身并沒有提供這樣的機(jī)制。

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

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

二 攔截器(Interceptor)

1.攔截器概述

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

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

2.定義攔截器(Interceptor)

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

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

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

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

3.注冊(cè)攔截器

自定義的攔截器,需要進(jìn)行注冊(cè)。可實(shí)現(xiàn)WebMvcConfigurer 接口,實(shí)現(xiàn) addInterceptors方法,為其添加新的攔截器。

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

4.AntPathMatcher

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

  • ? 匹配一個(gè)字符
  • * 匹配0個(gè)或多個(gè)字符
  • ** 匹配0個(gè)或多個(gè)目錄

5.攔截路徑

攔截路徑的簡(jiǎn)單示意:

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

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

dispatcherServlet的說(shuō)明:

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

執(zhí)行流程說(shuō)明:

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

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

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

三 全局異常處理

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

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

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

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

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

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

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

相關(guān)文章

  • Mybatis Mapper XML文件-插入,更新,刪除詳解(insert, update and delete)

    Mybatis Mapper XML文件-插入,更新,刪除詳解(insert, updat

    這篇文章主要介紹了MyBatis的Mapper XML文件中用于插入、更新和刪除數(shù)據(jù)的語(yǔ)句,包括這些語(yǔ)句的屬性和子元素的使用方法
    2025-02-02
  • Mybatis的parameterType造成線程阻塞問題分析

    Mybatis的parameterType造成線程阻塞問題分析

    這篇文章主要詳細(xì)分析了Mybatis的parameterType造成線程阻塞問題,文中有詳細(xì)的解決方法,及相關(guān)的代碼示例,具有一定的參考價(jià)值,感興趣的朋友可以借鑒閱讀
    2023-06-06
  • springboot如何連接兩個(gè)數(shù)據(jù)庫(kù)(多個(gè))

    springboot如何連接兩個(gè)數(shù)據(jù)庫(kù)(多個(gè))

    這篇文章主要介紹了springboot如何連接兩個(gè)數(shù)據(jù)庫(kù)(多個(gè)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java從文件中讀取數(shù)據(jù)的六種方法

    java從文件中讀取數(shù)據(jù)的六種方法

    本文主要介紹了java從文件中讀取數(shù)據(jù)的方法,詳細(xì)的介紹了六種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java串口通信入門

    Java串口通信入門

    串口通信是一種用于在計(jì)算機(jī)和外部設(shè)備之間進(jìn)行數(shù)據(jù)交換的通信方式,本文主要介紹了Java串口通信入門,并提供一個(gè)簡(jiǎn)單的示例來(lái)演示如何在Java中進(jìn)行串口通信,感興趣的可以了解一下
    2023-11-11
  • Java?file類中renameTo方法操作實(shí)例

    Java?file類中renameTo方法操作實(shí)例

    renameTo()方法是File類的一部分,renameTo()函數(shù)用于將文件的抽象路徑名重命名為給定的路徑名??,下面這篇文章主要給大家介紹了關(guān)于Java?file類中renameTo方法操作的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • 詳解Java的日期時(shí)間新特性

    詳解Java的日期時(shí)間新特性

    隨著時(shí)間的不斷推移,現(xiàn)實(shí)的需求也在不斷更新,原先的一些API已經(jīng)難以滿足開發(fā)需求了,從JDK?8之后,為了滿足更多的開發(fā)需求,Java給我們?cè)黾恿瞬簧訇P(guān)于日期時(shí)間的新特性,接下來(lái)就帶各位來(lái)看看這些新特性有哪些,需要的朋友可以參考下
    2023-06-06
  • Integer和int的區(qū)別實(shí)例詳解

    Integer和int的區(qū)別實(shí)例詳解

    這篇文章主要介紹了Integer和int的區(qū)別實(shí)例詳解,文字和代碼實(shí)例講解的很清楚,有感興趣的同學(xué)可以學(xué)習(xí)下
    2021-03-03
  • Java網(wǎng)絡(luò)通信中ServerSocket的設(shè)計(jì)優(yōu)化方案

    Java網(wǎng)絡(luò)通信中ServerSocket的設(shè)計(jì)優(yōu)化方案

    今天小編就為大家分享一篇關(guān)于Java網(wǎng)絡(luò)通信中ServerSocket的設(shè)計(jì)優(yōu)化方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • 在日志中記錄Java異常信息的正確姿勢(shì)分享

    在日志中記錄Java異常信息的正確姿勢(shì)分享

    這篇文章主要介紹了在日志中記錄Java異常信息的正確姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論