Java過濾器@WebFilter用法詳解
簡單介紹
@WebFilter注解是JavaEE中的一種注解,用于標(biāo)識一個類為過濾器(Filter)。過濾器用于對請求進行過濾和處理,可以在請求到達目標(biāo)資源之前或之后執(zhí)行一些操作。
使用**@WebFilter**注解可以將一個類聲明為過濾器,并指定過濾器的名稱、URL模式、Servlet名稱等。
優(yōu)勢
- 簡化配置:不再需要在web.xml文件中手動配置過濾器,而是通過注解直接配置在過濾器類上。
- 可讀性高:注解方式可以將過濾器的相關(guān)信息直接寫在過濾器類上,使得代碼更加簡潔和可讀。
- 方便管理:通過注解方式,可以更方便地管理和組織過濾器,減少了配置文件的復(fù)雜性。
方法
@WebFilter注解提供了以下屬性來配置過濾器:
- filterName:指定過濾器的名稱,可選屬性。
- urlPatterns:指定過濾器攔截的URL模式,可以是一個字符串?dāng)?shù)組,表示多個URL模式。
- value:urlPatterns的別名屬性,可以用來指定過濾器攔截的URL模式。
- servletNames:指定過濾器攔截的Servlet名稱,可以是一個字符串?dāng)?shù)組,表示多個Servlet名稱。
- dispatcherTypes:指定過濾器的調(diào)度類型,可以是DispatcherType枚舉類型的數(shù)組,默認為REQUEST。
- asyncSupported:指定過濾器是否支持異步請求,默認為false。
- initParams:指定過濾器的初始化參數(shù),以@WebInitParam注解的數(shù)組形式提供。
過濾器原理
當(dāng)我們使用過濾器時,過濾器會對游覽器的請求進行過濾,過濾器可以動態(tài)的分為3個部分,1.放行之前的代碼,2.放行,3.放行后的代碼,這3個部分分別會發(fā)揮不同作用
- 第一部分代碼會對游覽器請求進行第一次過濾,然后繼續(xù)執(zhí)行
- 第二部分代碼就是將游覽器請求放行,如果還有過濾器,那么就繼續(xù)交給下一個過濾器
- 第三部分代碼就是對返回的Web資源再次進行過濾處理
創(chuàng)建過濾器
創(chuàng)建MyFilter,只需要實現(xiàn)Filter接口就行,并且加一個WebFIlter注解
代碼演示
Filter的三個階段就對應(yīng)著Filter的3個方法,init方法會在Filter創(chuàng)建時調(diào)用,doFilter方法會在請求和攔截匹配時調(diào)用,destroy方法會在Filter銷毀時調(diào)用。
import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; import java.io.IOException; @WebFilter(initParams = {@WebInitParam(name = "aaa", value = "sss")}) public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("調(diào)用01過濾器"); String aaa = filterConfig.getInitParameter("aaa"); System.out.println(aaa); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("對01 request 進行過濾"); filterChain.doFilter(servletRequest, servletResponse); System.out.println("對01 response 過濾"); } @Override public void destroy() { System.out.println("01 調(diào)用了destroy方法"); } }
啟動服務(wù)器控制臺輸出
進行攔截時控制臺輸出
關(guān)閉服務(wù)器控制臺輸出 **
到此,我們就成功驗證了Filter的生命周期。 filterConfig.getInitParameter()是獲取我們注解配置得參數(shù)值value。根據(jù)上面圖解,大家可能會有個疑問為什么會有02**這個過濾器。那我們接下來就講一下。
多個過濾器
import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*") public class MyFilter2 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("調(diào)用02過濾器"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("對02 request 進行過濾"); filterChain.doFilter(servletRequest, servletResponse); System.out.println("對02 response 過濾"); } @Override public void destroy() { System.out.println("02 調(diào)用了destroy方法"); } }
我們可以看見Filter01先進行過濾,然后交給Filter02,然后訪問資源,然后Filter02對響應(yīng)進行過濾,然后Filter01對響應(yīng)進行過濾。
多個Filter的執(zhí)行順序
如果我們是使用@WebFilter進行配置的,那么執(zhí)行順序就是字符比較順序來執(zhí)行,例如有2個過濾器,一個是AFilter,一個是BFilter,那么AFilter就會先執(zhí)行。
總結(jié)
到此這篇關(guān)于Java過濾器@WebFilter用法詳解的文章就介紹到這了,更多相關(guān)Java過濾器@WebFilter內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring boot2X Consul如何使用Feign實現(xiàn)服務(wù)調(diào)用
這篇文章主要介紹了spring boot2X Consul如何使用Feign實現(xiàn)服務(wù)調(diào)用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12springboot中@Async默認線程池導(dǎo)致OOM問題
這篇文章主要介紹了springboot中@Async默認線程池導(dǎo)致OOM問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06spring?retry實現(xiàn)方法請求重試的使用步驟
這篇文章主要介紹了spring?retry實現(xiàn)方法請求重試及使用步驟,本文分步驟通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07關(guān)于@EnableGlobalMethodSecurity注解的用法解讀
這篇文章主要介紹了關(guān)于@EnableGlobalMethodSecurity注解的用法解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03Springboot實現(xiàn)人臉識別與WebSocket長連接的實現(xiàn)代碼
這篇文章主要介紹了Springboot實現(xiàn)人臉識別與WebSocket長連接的實現(xiàn),本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-11-11Java實現(xiàn)貪吃蛇大作戰(zhàn)小游戲(附源碼)
今天給大家?guī)淼氖切№椖渴?nbsp;基于Java+Swing+IO流實現(xiàn) 的貪吃蛇大作戰(zhàn)小游戲。實現(xiàn)了界面可視化、基本的吃食物功能、死亡功能、移動功能、積分功能,并額外實現(xiàn)了主動加速和鼓勵機制,需要的可以參考一下2022-07-07