Springboot工程中使用filter過程解析
一、什么是filter
過濾器實(shí)際上就是用來對(duì)web資源進(jìn)行攔截,做一些處理后再交給下一個(gè)過濾器或servlet處理 通常都是用來攔截request進(jìn)行處理的,也可以對(duì)返回的response進(jìn)行攔截處理 。
filter可以在請(qǐng)求到達(dá)servlet前或者請(qǐng)求完成響應(yīng)后進(jìn)行后續(xù)的處理。
二、在springboot工程中使用filter
創(chuàng)建一個(gè)filter,并使用注解配置該filter的名稱和攔截路徑等屬性
@WebFilter(filterName = "AFilter",urlPatterns = "/*") public class AFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { System.out.println("AFilter 開始執(zhí)行"); chain.doFilter(req, resp); System.out.println("AFilter 執(zhí)行完成"); } public void init(FilterConfig config) throws ServletException { } }
上面的代碼在doFilter方法中寫該過濾器的具體執(zhí)行邏輯,chain.doFilter用來把請(qǐng)求交給下一個(gè)過濾器或者servlet。
在啟動(dòng)類上使用注解@ServletComponentScan來掃描自定義的過濾器
@SpringBootApplication @ServletComponentScan public class BillAdminApplication { public static void main(String[] args) { SpringApplication.run(BillAdminApplication.class,args); } }
這樣自定義的過濾器就會(huì)被掃描到,就可以起作用。
三、過濾器的執(zhí)行順序
如果項(xiàng)目中配置了多個(gè)過濾器,并且使用的是注解配置,請(qǐng)求到來時(shí)過濾器名稱字母順序靠前的過濾器會(huì)先執(zhí)行;給客戶端返回響應(yīng)時(shí)過濾器的執(zhí)行順序和請(qǐng)求時(shí)的相反。
四、注意
使用以上這種方式來加載自定義過濾器時(shí),不能自定義過濾器的執(zhí)行順序,只能通過限定類名順序來達(dá)到目的。
五、使用FilterRegistrationBean 來注冊(cè)過濾器
當(dāng)需要自定義過濾器的執(zhí)行順序時(shí),可以使用FilterRegistrationBean來實(shí)現(xiàn)。
先創(chuàng)建一個(gè)過濾器,比如上邊的AFilter.java,不再需要注解@WebFilter,
再啟動(dòng)類或者配置類中注入一個(gè)如下的bean
@Bean public FilterRegistrationBean registrationBean1(){ FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean(); filterRegistrationBean.setFilter(new AFilter()); filterRegistrationBean.addUrlPatterns("/*"); filterRegistrationBean.setOrder(2); return filterRegistrationBean; }
使用這種方式,創(chuàng)建一個(gè)filterRegistrationBean對(duì)象,再設(shè)置其相關(guān)屬性,可以通過order屬性來設(shè)置過濾器的執(zhí)行順序,order值越小表示過濾器的優(yōu)先級(jí)越高,會(huì)先執(zhí)行。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Native實(shí)現(xiàn)0.059s啟動(dòng)一個(gè)SpringBoot項(xiàng)目
Spring Native是Spring框架的一個(gè)子項(xiàng)目,旨在提供一種將Spring應(yīng)用程序編譯為本地可執(zhí)行文件的方法,從而提高啟動(dòng)時(shí)間和資源效率,本文主要介紹了Spring Native實(shí)現(xiàn)0.059s啟動(dòng)一個(gè)SpringBoot項(xiàng)目,感興趣的可以了解一下2024-02-02Spring?MVC請(qǐng)求轉(zhuǎn)發(fā)與請(qǐng)求重定向的示例詳解
轉(zhuǎn)發(fā)指服務(wù)器接收請(qǐng)求后,從一個(gè)資源跳轉(zhuǎn)到另一個(gè)資源中,請(qǐng)求轉(zhuǎn)發(fā)是一次請(qǐng)求,不會(huì)改變?yōu)g覽器的請(qǐng)求地址,這篇文章主要介紹了Spring?MVC請(qǐng)求轉(zhuǎn)發(fā)與請(qǐng)求重定向的相關(guān)知識(shí),需要的朋友可以參考下2023-09-09關(guān)于Java雙大括號(hào){{}}的具體使用
本文主要介紹了關(guān)于Java雙大括號(hào){{}}的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Java多線程和并發(fā)基礎(chǔ)面試題(問答形式)
多線程和并發(fā)問題是Java技術(shù)面試中面試官比較喜歡問的問題之一。在這里,從面試的角度列出了大部分重要的問題,感興趣的小伙伴們可以參考一下2016-06-06SpringBoot實(shí)現(xiàn)短信發(fā)送及手機(jī)驗(yàn)證碼登錄
本文主要介紹了SpringBoot實(shí)現(xiàn)短信發(fā)送及手機(jī)驗(yàn)證碼登錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07