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

Springboot項(xiàng)目快速實(shí)現(xiàn)過濾器功能

 更新時(shí)間:2023年03月28日 08:57:15   作者:凡夫販夫  
上篇文章已經(jīng)給大家介紹了Springboot項(xiàng)目如何快速實(shí)現(xiàn)Aop功能,這篇文章給大家介紹Springboot項(xiàng)目如何快速實(shí)現(xiàn)過濾器功能,感興趣的小伙伴可以參考閱讀

前言

很多時(shí)候,當(dāng)你以為掌握了事實(shí)真相的時(shí)間,如果你能再深入一點(diǎn),你可能會(huì)發(fā)現(xiàn)另外一些真相。比如面向切面編程的最佳編程實(shí)踐是AOP,AOP的主要作用就是可以定義切入點(diǎn),并在切入點(diǎn)縱向織入一些額外的統(tǒng)一操作,避免與業(yè)務(wù)代碼過度耦合。熟悉java web項(xiàng)目的都知道,另外還有過濾器(filter)、攔截器(interceptor)也有類似AOP的功能特性,那么問題來了:為什么一般說面向切面編程就是指AOP,而不是過濾器和攔截器?過濾器和攔截器在Spring boot中怎么實(shí)現(xiàn)?這三者之間有什么區(qū)別?Springboot項(xiàng)目快速實(shí)現(xiàn)Aop功能中分享了AOP的相關(guān)實(shí)現(xiàn),下面將再用兩到三篇文章,分別和大家分享一下過濾器、攔截器的實(shí)現(xiàn),以及AOP、過濾器、攔截器之間的橫向?qū)Ρ?,以便在業(yè)務(wù)開發(fā)中,能夠快速、正確選對(duì)具體實(shí)現(xiàn)方法。

環(huán)境配置

jdk版本:1.8

開發(fā)工具:Intellij iDEA 2020.1

springboot:2.3.9.RELEASE

Filter簡(jiǎn)介

Filter, 中文意思是過濾器,F(xiàn)ilter的全限定類名是javax.servlet.Filter,可以看出這是與servelt相關(guān)的一個(gè)接口;SpringMVC核心是DispatcherServlet,而DispatcherServlet又繼承了Servlet,進(jìn)而可以推測(cè)出Filter與SpringMVC也是關(guān)聯(lián)關(guān)系。

事實(shí)上這樣的推測(cè)也是正確的,在SpringMVC項(xiàng)目中,filter在瀏覽器與服務(wù)器之間起過濾的作用,可以截取客戶端和服務(wù)端之間的請(qǐng)求和響應(yīng)信息,并根據(jù)這些請(qǐng)求-響應(yīng)信息作一些其他的操作,但是要注意,filter并不能改變請(qǐng)求-響應(yīng)信息;

核心類

Filter

Filter接口的全限定類名是javax.servlet.Filter,該接口有三個(gè)方法,分別是

1、init(...):用于初始化Filter;

2、doFilter(...):過濾請(qǐng)求和攔截響應(yīng)信息的具體實(shí)現(xiàn)在這個(gè)方法里;

3、destroy(...):Filter對(duì)象被銷毀時(shí)觸發(fā),主要用于做一些收尾工作,如資源的釋放等;

FilterConfig

FilterConfig接口的全限定類名是javax.servlet.FilterConfig,該接口主要有四個(gè)方法,分別是:

1、getFilterName() 獲取Filter的名字;

2、getServletContext() 獲取ServletContext對(duì)象(即application);

3、getInitParameter() 獲取Filter的初始化參數(shù);

4、getInitParameterNames() 獲取所有初始化參數(shù)的名字;

FilterChain

FilterChainr接口的全限定類名是javax.servlet.FilterChain,該接口只有一個(gè)方法,是doFilter()方法,用于調(diào)用Filter鏈上的下一個(gè)過濾器,如果當(dāng)前過濾器為最后一個(gè)或只有一個(gè)過濾器,則該過濾器則將請(qǐng)求發(fā)送到目標(biāo)資源。

MyFilter2是自己實(shí)現(xiàn)的過濾器,實(shí)現(xiàn)了Filter接口;Filter接口依賴FilterChain接口和FilterConfig接口,其中FilterChain接口的實(shí)現(xiàn)類是org.apache.catalina.core.ApplicationFilterChain,F(xiàn)ilterConfig接口的實(shí)現(xiàn)類是org.apache.catalina.core.ApplicationFilterConfig;

工作原理

1、項(xiàng)目啟動(dòng)的時(shí)候,先執(zhí)行Filter的構(gòu)造方法,完成相關(guān)Filter對(duì)象的注冊(cè);

2、緊接著,F(xiàn)ilter對(duì)象的init()方法被調(diào)用,開始對(duì)Filter做一些初始化操作;

3、項(xiàng)目啟動(dòng)完成后,客戶端每次向服務(wù)端發(fā)起請(qǐng)求時(shí),如果請(qǐng)求地址與過濾器定義的地址匹配,則會(huì)執(zhí)行Filter的doFilter();如果匹配上多個(gè)過濾器,則會(huì)形成一個(gè)鏈路,依次調(diào)用各個(gè)過濾器對(duì)象的doFilter();服務(wù)端作出響應(yīng)后,也會(huì)再次執(zhí)行到各個(gè)過濾器對(duì)象的doFilter();請(qǐng)求和響應(yīng)時(shí),過濾器鏈的執(zhí)行順序是先進(jìn)后出;

4、服務(wù)器停止時(shí)調(diào)用Filter的destroy()方法,用來釋放資源。

實(shí)現(xiàn)方式

Springboot項(xiàng)目中一般有兩種方式:

1、@WebFilter注解,即javax.servlet.annotation.WebFilter;

2、FilterRegistrationBean,即org.springframework.boot.web.servlet.FilterRegistrationBean;

兩種方式,都需要在啟動(dòng)類上增加注解@ServletComponentScan,用于開啟servlet相關(guān)bean的掃描,其中包含有過濾器(Filter);

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

代碼實(shí)現(xiàn)

1、WebFilter注解里,定義一下過濾器的名字,以及要對(duì)哪些請(qǐng)求進(jìn)行過濾,“/*”表示對(duì)所有的請(qǐng)求都過濾,在實(shí)際業(yè)務(wù)中,可具體對(duì)待;如果在初始化的時(shí)候,需要攜帶一些初始化的參數(shù),可以在initParams屬性上,使用@WebInitParam注解來定義初始化參數(shù)名稱和具體的值,這些參數(shù)可以在filter對(duì)象初始化的時(shí)候獲取到;MyFIlter1和MyFIlter2使用的注解方式定義的過濾器;

@Slf4j
@WebFilter(filterName = "myFilter1", urlPatterns = "/*", initParams = {@WebInitParam(name = "creator", value = "fanfu")})
public class MyFilter1 implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("http://myFilter1初始化開始");
        String creator = filterConfig.getInitParameter("creator");
        log.info("http://初始化參數(shù)creator:{}",creator);
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("http://myFilter1開始執(zhí)行");
        chain.doFilter(request, response);
        log.info("http://myFilter1結(jié)束執(zhí)行");
    }
 
    @Override
    public void destroy() {
        log.info("http://myfilter1被銷毀");
    }
}
@Slf4j
@WebFilter(filterName = "myFilter2", urlPatterns = "/*")
public class MyFilter2 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("http://myFilter2初始化開始");
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("http://myFilter2開始執(zhí)行");
        chain.doFilter(request, response);
        log.info("http://myFilter2結(jié)束執(zhí)行");
    }
 
    @Override
    public void destroy() {
        log.info("http://myFilter2被銷毀");
    }
}

2、FilterRegistrationBean方式

在Springboot項(xiàng)目的配置類中,使用FilterRegistrationBean來包裝自定義的過濾器,這種方式的最大好處就是可以自定義過濾器的執(zhí)行順序,數(shù)字越小,執(zhí)行時(shí)的優(yōu)先級(jí)就越高;MyFIlter3和MyFIlter4是使用FilterRegistrationBean方式定義的過濾器;

@Configuration
public class WebConfig {
 
    @Bean
    public FilterRegistrationBean filterRegistration1() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new MyFilter3());
        filterRegistrationBean.addUrlPatterns("/*");//定義過濾器對(duì)哪些請(qǐng)求路徑進(jìn)行過濾,/*表示對(duì)所有請(qǐng)求都過濾
        filterRegistrationBean.setOrder(2);//定義過濾器的執(zhí)行優(yōu)先級(jí),數(shù)據(jù)越小優(yōu)先級(jí)越高
        return filterRegistrationBean;
    }
 
    @Bean
    public FilterRegistrationBean filterRegistration2() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new MyFilter4());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }
}
@Slf4j
public class MyFilter3 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    log.info("http://MyFilter3初始化開始");
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("http://MyFilter3開始執(zhí)行");
        chain.doFilter(request,response);
        log.info("http://MyFilter3結(jié)束執(zhí)行");
    }
 
    @Override
    public void destroy() {
        log.info("http://MyFilter3被銷毀");
    }
}
@Slf4j
public class MyFilter4 implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("http://MyFilter4初始化開始");
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("http://MyFilter4開始執(zhí)行");
        chain.doFilter(request,response);
        log.info("http://MyFilter4結(jié)束執(zhí)行");
    }
 
    @Override
    public void destroy() {
        log.info("http://MyFilter4被銷毀");
    }
}

未定義myFilter3、myFilter4的執(zhí)行優(yōu)先級(jí),即采取自然排序時(shí)的執(zhí)行結(jié)果:在請(qǐng)求前myFilter3的執(zhí)行時(shí)機(jī)早于myFilter4,響應(yīng)后myFilter3的執(zhí)行時(shí)機(jī)要晚于myFilter4;

定義myFilter4的優(yōu)先級(jí)高于myFilter3時(shí),執(zhí)行結(jié)果:在請(qǐng)求前myFilter4的執(zhí)行時(shí)機(jī)早于myFilter3,響應(yīng)后的myFilter4的執(zhí)行時(shí)機(jī)要晚于myFilter3;

總結(jié)

過濾器的實(shí)現(xiàn)是比較簡(jiǎn)單,通過梳理這個(gè)過程,我get到以下幾個(gè)點(diǎn):

1、過濾器是用于SpringMVC項(xiàng)目中,即與servlet相關(guān)的項(xiàng)目;

2、過濾器的執(zhí)行時(shí)機(jī)是在請(qǐng)求前和響應(yīng)后,有兩種實(shí)現(xiàn)方式,即@WebFilter注解和FilterRegistrationBean;如果對(duì)過濾器的執(zhí)行順序沒有限制要求,則可以使用第一種;如果對(duì)過濾器的執(zhí)行順序有明確限制,則可以使用第二種;

3、如果有多個(gè)過濾器對(duì)象時(shí),會(huì)形成一個(gè)過濾器鏈,過濾器的執(zhí)行順序是先進(jìn)后出;

4、過濾器可以過濾請(qǐng)求和攔截響應(yīng),但是不能改變請(qǐng)求值和響應(yīng)值;

到此這篇關(guān)于Springboot項(xiàng)目快速實(shí)現(xiàn)過濾器功能的文章就介紹到這了,更多相關(guān)Springboot實(shí)現(xiàn)過濾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java創(chuàng)建對(duì)象的四種方式詳解

    Java創(chuàng)建對(duì)象的四種方式詳解

    這篇文章主要介紹了Java創(chuàng)建對(duì)象的四種方式詳解,如果我們不想利用默認(rèn)構(gòu)造器來創(chuàng)建java對(duì)象,而想利用指定的構(gòu)造器來創(chuàng)建java對(duì)象,則需要利用Construtor對(duì)象,每個(gè)Construtor對(duì)應(yīng)一個(gè)構(gòu)造器,需要的朋友可以參考下
    2023-11-11
  • Mybatis-plus 批量插入太慢的問題解決(提升插入性能)

    Mybatis-plus 批量插入太慢的問題解決(提升插入性能)

    公司使用的Mybatis-Plus操作SQL,用過Mybatis-Plus的小伙伴一定知道他有很多API提供給我們使用,但是批量插入大數(shù)據(jù)太慢應(yīng)該怎么解決,本文就詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-11-11
  • springboot+jersey+tomcat實(shí)現(xiàn)跨域方式上傳文件到服務(wù)器的方式

    springboot+jersey+tomcat實(shí)現(xiàn)跨域方式上傳文件到服務(wù)器的方式

    這篇文章主要介紹了springboot+jersey+tomcat實(shí)現(xiàn)跨域方式上傳文件到服務(wù)器,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Spring Boot 如何將 Word 轉(zhuǎn)換為 PDF

    Spring Boot 如何將 Word 轉(zhuǎn)換為 PDF

    這篇文章主要介紹了Spring Boot將Word轉(zhuǎn)換為 PDF,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • 基于java構(gòu)造方法Vector刪除元素源碼分析

    基于java構(gòu)造方法Vector刪除元素源碼分析

    這篇文章主要介紹了基于java構(gòu)造方法中對(duì)Vector刪除元素的源碼分析,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家早日升職加薪
    2021-09-09
  • Java Swagger技術(shù)使用指南

    Java Swagger技術(shù)使用指南

    Swagger 是一個(gè)規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化 RESTful 風(fēng)格的 Web 服務(wù)。總體目標(biāo)是使客戶端和文件系統(tǒng)作為服務(wù)器以同樣的速度來更新。文件的方法,參數(shù)和模型緊密集成到服務(wù)器端的代碼,允許API來始終保持同步
    2021-09-09
  • 淺談java安全編碼指南之堆污染

    淺談java安全編碼指南之堆污染

    什么是堆污染呢?是指當(dāng)參數(shù)化類型變量引用的對(duì)象不是該參數(shù)化類型的對(duì)象時(shí)而發(fā)生的。我們知道在JDK5中,引入了泛型的概念,在創(chuàng)建集合類的時(shí)候,指定該集合類中應(yīng)該存儲(chǔ)的對(duì)象類型。如果在指定類型的集合中,引用了不同的類型,那么這種情況就叫做堆污染。
    2021-06-06
  • Java數(shù)據(jù)結(jié)構(gòu)之常見排序算法(下)

    Java數(shù)據(jù)結(jié)構(gòu)之常見排序算法(下)

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之常見排序算法(下),與之相對(duì)有(上),想了解的朋友可以去本網(wǎng)站掃搜,在這兩篇文章里涵蓋關(guān)于八大排序算法的所有內(nèi)容,需要的朋友可以參考下
    2023-01-01
  • Java利用位運(yùn)算實(shí)現(xiàn)加減運(yùn)算詳解

    Java利用位運(yùn)算實(shí)現(xiàn)加減運(yùn)算詳解

    這篇文章主要為大家介紹了如何使用位運(yùn)算來實(shí)現(xiàn)加減功能,也就是在整個(gè)運(yùn)算過程中不能出現(xiàn)加減符號(hào)。文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-12-12
  • Java中RabbitMQ消息隊(duì)列的交換機(jī)詳解

    Java中RabbitMQ消息隊(duì)列的交換機(jī)詳解

    這篇文章主要介紹了Java中的RabbitMQ交換機(jī)詳解,消息隊(duì)列是指利用高效可靠的消息傳遞機(jī)制進(jìn)行與平臺(tái)無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進(jìn)行分布式系統(tǒng)的集成,是在消息的傳輸過程中保存消息的容器,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

岫岩| 麻江县| 茂名市| 墨玉县| 西和县| 泰州市| 烟台市| 台州市| 平陆县| 阿巴嘎旗| 仙游县| 海伦市| 南开区| 黔南| 中西区| 顺平县| 巴青县| 陇南市| 化州市| 宁国市| 鄯善县| 定边县| 南昌市| 巧家县| 常宁市| 万载县| 浏阳市| 石狮市| 蒲江县| 漾濞| 满洲里市| 中超| 封开县| 苗栗县| 泰宁县| 隆昌县| 兴隆县| 华容县| 呈贡县| 江华| 枣强县|