Java過(guò)濾器@WebFilter用法詳解
簡(jiǎn)單介紹
@WebFilter注解是JavaEE中的一種注解,用于標(biāo)識(shí)一個(gè)類(lèi)為過(guò)濾器(Filter)。過(guò)濾器用于對(duì)請(qǐng)求進(jìn)行過(guò)濾和處理,可以在請(qǐng)求到達(dá)目標(biāo)資源之前或之后執(zhí)行一些操作。
使用**@WebFilter**注解可以將一個(gè)類(lèi)聲明為過(guò)濾器,并指定過(guò)濾器的名稱(chēng)、URL模式、Servlet名稱(chēng)等。
優(yōu)勢(shì)
- 簡(jiǎn)化配置:不再需要在web.xml文件中手動(dòng)配置過(guò)濾器,而是通過(guò)注解直接配置在過(guò)濾器類(lèi)上。
- 可讀性高:注解方式可以將過(guò)濾器的相關(guān)信息直接寫(xiě)在過(guò)濾器類(lèi)上,使得代碼更加簡(jiǎn)潔和可讀。
- 方便管理:通過(guò)注解方式,可以更方便地管理和組織過(guò)濾器,減少了配置文件的復(fù)雜性。
方法
@WebFilter注解提供了以下屬性來(lái)配置過(guò)濾器:
- filterName:指定過(guò)濾器的名稱(chēng),可選屬性。
- urlPatterns:指定過(guò)濾器攔截的URL模式,可以是一個(gè)字符串?dāng)?shù)組,表示多個(gè)URL模式。
- value:urlPatterns的別名屬性,可以用來(lái)指定過(guò)濾器攔截的URL模式。
- servletNames:指定過(guò)濾器攔截的Servlet名稱(chēng),可以是一個(gè)字符串?dāng)?shù)組,表示多個(gè)Servlet名稱(chēng)。
- dispatcherTypes:指定過(guò)濾器的調(diào)度類(lèi)型,可以是DispatcherType枚舉類(lèi)型的數(shù)組,默認(rèn)為REQUEST。
- asyncSupported:指定過(guò)濾器是否支持異步請(qǐng)求,默認(rèn)為false。
- initParams:指定過(guò)濾器的初始化參數(shù),以@WebInitParam注解的數(shù)組形式提供。
過(guò)濾器原理
當(dāng)我們使用過(guò)濾器時(shí),過(guò)濾器會(huì)對(duì)游覽器的請(qǐng)求進(jìn)行過(guò)濾,過(guò)濾器可以動(dòng)態(tài)的分為3個(gè)部分,1.放行之前的代碼,2.放行,3.放行后的代碼,這3個(gè)部分分別會(huì)發(fā)揮不同作用
- 第一部分代碼會(huì)對(duì)游覽器請(qǐng)求進(jìn)行第一次過(guò)濾,然后繼續(xù)執(zhí)行
- 第二部分代碼就是將游覽器請(qǐng)求放行,如果還有過(guò)濾器,那么就繼續(xù)交給下一個(gè)過(guò)濾器
- 第三部分代碼就是對(duì)返回的Web資源再次進(jìn)行過(guò)濾處理

創(chuàng)建過(guò)濾器
創(chuàng)建MyFilter,只需要實(shí)現(xiàn)Filter接口就行,并且加一個(gè)WebFIlter注解

代碼演示
Filter的三個(gè)階段就對(duì)應(yīng)著Filter的3個(gè)方法,init方法會(huì)在Filter創(chuàng)建時(shí)調(diào)用,doFilter方法會(huì)在請(qǐng)求和攔截匹配時(shí)調(diào)用,destroy方法會(huì)在Filter銷(xiāo)毀時(shí)調(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過(guò)濾器");
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("對(duì)01 request 進(jìn)行過(guò)濾");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("對(duì)01 response 過(guò)濾");
}
@Override
public void destroy() {
System.out.println("01 調(diào)用了destroy方法");
}
}
啟動(dòng)服務(wù)器控制臺(tái)輸出

進(jìn)行攔截時(shí)控制臺(tái)輸出

關(guān)閉服務(wù)器控制臺(tái)輸出 **

到此,我們就成功驗(yàn)證了Filter的生命周期。 filterConfig.getInitParameter()是獲取我們注解配置得參數(shù)值value。根據(jù)上面圖解,大家可能會(huì)有個(gè)疑問(wèn)為什么會(huì)有02**這個(gè)過(guò)濾器。那我們接下來(lái)就講一下。
多個(gè)過(guò)濾器
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過(guò)濾器");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("對(duì)02 request 進(jìn)行過(guò)濾");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("對(duì)02 response 過(guò)濾");
}
@Override
public void destroy() {
System.out.println("02 調(diào)用了destroy方法");
}
}

我們可以看見(jiàn)Filter01先進(jìn)行過(guò)濾,然后交給Filter02,然后訪問(wèn)資源,然后Filter02對(duì)響應(yīng)進(jìn)行過(guò)濾,然后Filter01對(duì)響應(yīng)進(jìn)行過(guò)濾。

多個(gè)Filter的執(zhí)行順序
如果我們是使用@WebFilter進(jìn)行配置的,那么執(zhí)行順序就是字符比較順序來(lái)執(zhí)行,例如有2個(gè)過(guò)濾器,一個(gè)是AFilter,一個(gè)是BFilter,那么AFilter就會(huì)先執(zhí)行。
總結(jié)
到此這篇關(guān)于Java過(guò)濾器@WebFilter用法詳解的文章就介紹到這了,更多相關(guān)Java過(guò)濾器@WebFilter內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring boot2X Consul如何使用Feign實(shí)現(xiàn)服務(wù)調(diào)用
這篇文章主要介紹了spring boot2X Consul如何使用Feign實(shí)現(xiàn)服務(wù)調(diào)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
springboot中@Async默認(rèn)線程池導(dǎo)致OOM問(wèn)題
這篇文章主要介紹了springboot中@Async默認(rèn)線程池導(dǎo)致OOM問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
java必懂的冷知識(shí)點(diǎn)之Base64加密與解密
這篇文章主要介紹了java必懂的冷知識(shí)點(diǎn)之Base64加密與解密的相關(guān)資料,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
spring?retry實(shí)現(xiàn)方法請(qǐng)求重試的使用步驟
這篇文章主要介紹了spring?retry實(shí)現(xiàn)方法請(qǐng)求重試及使用步驟,本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
關(guān)于@EnableGlobalMethodSecurity注解的用法解讀
這篇文章主要介紹了關(guān)于@EnableGlobalMethodSecurity注解的用法解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Springboot實(shí)現(xiàn)人臉識(shí)別與WebSocket長(zhǎng)連接的實(shí)現(xiàn)代碼
這篇文章主要介紹了Springboot實(shí)現(xiàn)人臉識(shí)別與WebSocket長(zhǎng)連接的實(shí)現(xiàn),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11
java如何將list中的某個(gè)元素移動(dòng)位置
在Java編程中我們經(jīng)常會(huì)使用List數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)一組元素,下面這篇文章主要給大家介紹了關(guān)于java如何將list中的某個(gè)元素移動(dòng)位置的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05
Java實(shí)現(xiàn)貪吃蛇大作戰(zhàn)小游戲(附源碼)
今天給大家?guī)?lái)的是小項(xiàng)目是 基于Java+Swing+IO流實(shí)現(xiàn) 的貪吃蛇大作戰(zhàn)小游戲。實(shí)現(xiàn)了界面可視化、基本的吃食物功能、死亡功能、移動(dòng)功能、積分功能,并額外實(shí)現(xiàn)了主動(dòng)加速和鼓勵(lì)機(jī)制,需要的可以參考一下2022-07-07

