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

SptingBoot過濾器Filter的使用詳解

 更新時(shí)間:2023年09月25日 10:08:42   作者:騎個(gè)小蝸牛  
這篇文章主要介紹了SptingBoot過濾器Filter的使用詳解,Filter屬于Servlet規(guī)范,并不是Spring獨(dú)有的,Filter主要用于攔截請(qǐng)求,做一些業(yè)務(wù)邏輯操作,然后可以決定請(qǐng)求是否可以繼續(xù)往下分發(fā),落到其他的Filter或者對(duì)應(yīng)的Servlet,需要的朋友可以參考下

Filter

Filter屬于Servlet規(guī)范,并不是Spring獨(dú)有的。Filter主要用于攔截請(qǐng)求,做一些業(yè)務(wù)邏輯操作,然后可以決定請(qǐng)求是否可以繼續(xù)往下分發(fā),落到其他的Filter或者對(duì)應(yīng)的Servlet。

Filter的工作流程

  1. 進(jìn)入filter,執(zhí)行相關(guān)業(yè)務(wù)邏輯
  2. 若判定失敗,直接返回,不需要將請(qǐng)求發(fā)給Servlet
  3. 若判定通行,進(jìn)行入下一個(gè)filter
  4. 如果全部filter通行,進(jìn)入Servlet邏輯,Servlet執(zhí)行完畢之后,又返回Filter,最后在返回給請(qǐng)求方

自定義Filter的使用方式

Spring中過濾器Filter不同使用方式都是通過:FilterRegistrationBean包裝filter,最終注冊(cè)到Servlet容器中。

1. @WebFilter+@ServletComponentScan

在SpringBootApplication上添加@ServletComponentScan注解,在Filter上添加@WebFilter注解。

該方式的缺點(diǎn):無法設(shè)置過濾器之間的優(yōu)先級(jí)。

@WebFilter+@ServletComponentScan方式無法通過@Order注解指定過濾器優(yōu)先級(jí):優(yōu)先級(jí)使用默認(rèn)值Ordered.LOWEST_PRECEDENCE(2147483647),相同優(yōu)先級(jí)的情況下,根據(jù)名字先后順序來決定。

使用方法

1. 在SpringBootApplication上使用@ServletComponentScan注解

@ServletComponentScan
@SpringBootApplication
public class SpringbootApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }
}

2.在Filter上使用@WebFilter注解

@WebFilter(urlPatterns = {"/test3"})
public class MyFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        System.out.println("======= MyFilter =======");
        filterChain.doFilter(request,response);
    }
}

@WebFilter

@WebFilter用于將一個(gè)類聲明為過濾器。

WebFilter注解的主要屬性:

屬性名類型描述
filterNameString指定過濾器的name屬性,(springbean也是用該名稱),等價(jià)于< filter-name>
urlPatternsString[]指定一組過濾器的URL匹配模式。等價(jià)于< url-pattern>
valueString[]該屬性等價(jià)于urlPatterns屬性,但是兩個(gè)不應(yīng)該同時(shí)使用
sevletNamesString[]指定過濾器將用于哪些servlet。取值是@WebServlet中的name屬性的取值,或者是web.xml中< servlet-name>
dispatcherTypesDispatcherType[]指定一組過濾器的轉(zhuǎn)發(fā)模式。具體取值包括:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST,默認(rèn)REQUEST
initParamsWebInitParam[]指定一組過濾器初始化參數(shù),等價(jià)于< init-param>
asyncSupportedboolean聲明過濾器是否支持異步操作模式,等價(jià)于< async-supported>標(biāo)簽
descriptionString過濾器的描述信息,等價(jià)于< description>
displayNameString過濾器的顯示名,通常配合工具使用,等價(jià)于< display-name>

在SpringBoot項(xiàng)目中,@WebServlet、@WebFilter、@WebListener這三個(gè)注解默認(rèn)是不會(huì)被掃描的,一般在SpringBootApplication上添加@ServletComponentScan注解,表示對(duì)這三個(gè)注解的掃描。

@ServletComponentScan可以實(shí)現(xiàn)將Servlet(控制器)、Filter(過濾器)、Listener(監(jiān)聽器)自動(dòng)注冊(cè)到Spring容器中,無需其他代碼。

  • Servlet:通過@WebServlet注解定義
  • Filter:通過@WebFilter注解定義
  • Listener:通過@WebListener注解定義

常見問題分析

1. 只使用@WebFilte:過濾器不生效

WebFilter屬于注解屬于Servlet3+,與Spring本身沒有什么關(guān)系,所以Spring默認(rèn)是不認(rèn)識(shí)這個(gè)注解的。

2. @WebFilter+@Component:配置的過濾條件不生效 同上,Spring是不認(rèn)識(shí)@WebFilter注解的,所以注解配置的任何屬性都無意義(例如:指定過濾的url)。 該種方式其實(shí)就等同于只加了個(gè)@Component注解,此時(shí)過濾器能生效,但無過濾條件,會(huì)過濾所有url。

3. @WebFilter+@Component+@ServletComponentScan:過濾器會(huì)被調(diào)用兩次

  • 一次:@WebFilter+@ServletComponentScan,被SpringBean管理,過濾器生效,根據(jù)@WebFilter配置的屬性過濾
  • 二次:@Component,又被SpringBean管理一次,過濾器生效(和上面不是同一個(gè)bean),過濾全部url

4. @WebFilter+@Order+@ServletComponentScan:設(shè)置過濾器優(yōu)先級(jí)無效

通過@WebFilter+@ServletComponentScan方式注冊(cè)的,其生成的FilterRegistrationBean并沒有檢查@Order注解,所以@Order注解不生效。

2. @Component+@Order

通過在Filter上加@Component和@Order注解,即可被Spring管理,并可指定過濾器的執(zhí)行順序。

該方式的缺點(diǎn):只能過濾所有URL,不能通過配置去過濾指定的 URL。

使用方法

@Order(100)
@Component
public class MyFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        System.out.println("======= MyFilter =======");
        filterChain.doFilter(request,response);
    }
}

3. FilterRegistrationBean(推薦)

直接通過配置類定義Filter的FilterRegistrationBean,交給SpringBean容器管理。

該方式既能通過配置去過濾指定的 URL,也能指定過濾器之間的優(yōu)先級(jí)。

使用方法

public class MyFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        System.out.println("======= MyFilter =======");
        filterChain.doFilter(request,response);
    }
}
@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<MyFilter> filterRegistrationBean() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(myFilter());
        registration.setName("myFilter");
        registration.addUrlPatterns("/test3");
        registration.setOrder(100);
        return registration;
    }
    @Bean
    public MyFilter myFilter() {
        return new MyFilter();
    }
}

到此這篇關(guān)于SptingBoot過濾器Filter的使用詳解的文章就介紹到這了,更多相關(guān)SptingBoot過濾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java Exchanger并發(fā)類使用方法

    Java Exchanger并發(fā)類使用方法

    這篇文章主要介紹了Java Exchanger并發(fā)類使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • spring實(shí)現(xiàn)動(dòng)態(tài)切換、添加數(shù)據(jù)源及源碼分析

    spring實(shí)現(xiàn)動(dòng)態(tài)切換、添加數(shù)據(jù)源及源碼分析

    這篇文章主要給大家介紹了關(guān)于spring實(shí)現(xiàn)動(dòng)態(tài)切換、添加數(shù)據(jù)源及源碼分析的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • SpringBoot 集成 Druid過程解析

    SpringBoot 集成 Druid過程解析

    這篇文章主要介紹了SpringBoot 集成 Druid過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 詳細(xì)解讀Java的Lambda表達(dá)式

    詳細(xì)解讀Java的Lambda表達(dá)式

    這篇文章主要介紹了詳細(xì)解讀Java的Lambda表達(dá)式,lambda?表達(dá)式?是Java?8新加入的新特性,它在Java中是引入了函數(shù)式編程這一概念,需要的朋友可以參考下
    2023-04-04
  • java字節(jié)流、字符流與轉(zhuǎn)換流過程

    java字節(jié)流、字符流與轉(zhuǎn)換流過程

    輸入輸出流(IO流)是數(shù)據(jù)傳輸?shù)某橄蟾拍?用于表示數(shù)據(jù)在設(shè)備間的傳輸過程,IO流按數(shù)據(jù)類型分為字符流和字節(jié)流,按數(shù)據(jù)流向分為輸入流和輸出流,字節(jié)流操作單個(gè)字節(jié),字符流操作字符,在實(shí)際應(yīng)用中,非文本文件多用字節(jié)流操作
    2024-10-10
  • MybatisPlus中插入數(shù)據(jù)后獲取該對(duì)象主鍵值的實(shí)現(xiàn)

    MybatisPlus中插入數(shù)據(jù)后獲取該對(duì)象主鍵值的實(shí)現(xiàn)

    這篇文章主要介紹了MybatisPlus中插入數(shù)據(jù)后獲取該對(duì)象主鍵值,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java?Nacos與Gateway的使用操作筆記

    Java?Nacos與Gateway的使用操作筆記

    Spring?Cloud?Gateway?是一個(gè)用于構(gòu)建?API?網(wǎng)關(guān)的框架,提供了多種服務(wù)路由、過濾和負(fù)載均衡的功能,這篇文章主要介紹了Java?Nacos與Gateway的使用操作筆記,需要的朋友可以參考下
    2024-08-08
  • 詳解spring cloud config實(shí)現(xiàn)datasource的熱部署

    詳解spring cloud config實(shí)現(xiàn)datasource的熱部署

    這篇文章主要介紹了詳解spring cloud config實(shí)現(xiàn)datasource的熱部署,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • spring security的BCryptPasswordEncoder加密和對(duì)密碼驗(yàn)證的原理分析

    spring security的BCryptPasswordEncoder加密和對(duì)密碼驗(yàn)證的原理分析

    文章介紹了加密算法和hash算法的基本概念,以及BCryptPasswordEncoder加密和解密的原理,加密算法是可逆的,需要加鹽以保證安全性,BCryptPasswordEncoder通過生成鹽值并在加密和解密過程中使用,確保相同的明文每次加密結(jié)果不同,從而提高安全性
    2024-11-11
  • Java設(shè)計(jì)模塊系列之書店管理系統(tǒng)單機(jī)版(二)

    Java設(shè)計(jì)模塊系列之書店管理系統(tǒng)單機(jī)版(二)

    這篇文章主要為大家詳細(xì)介紹了Java單機(jī)版的書店管理系統(tǒng)設(shè)計(jì)模塊和思想第二章,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評(píng)論