簡單介紹
@WebFilter注解是JavaEE中的一種注解,用于標(biāo)識一個類為過濾器(Filter)。過濾器用于對請求進(jìn)行過濾和處理,可以在請求到達(dá)目標(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ù)組,默認(rèn)為REQUEST。
asyncSupported:指定過濾器是否支持異步請求,默認(rèn)為false。
initParams:指定過濾器的初始化參數(shù),以@WebInitParam注解的數(shù)組形式提供。
過濾器原理
當(dāng)我們使用過濾器時,過濾器會對游覽器的請求進(jìn)行過濾,過濾器可以動態(tài)的分為3個部分,1.放行之前的代碼,2.放行,3.放行后的代碼,這3個部分分別會發(fā)揮不同作用
第一部分代碼會對游覽器請求進(jìn)行第一次過濾,然后繼續(xù)執(zhí)行
第二部分代碼就是將游覽器請求放行,如果還有過濾器,那么就繼續(xù)交給下一個過濾器
第三部分代碼就是對返回的Web資源再次進(jìn)行過濾處理
創(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 進(jìn)行過濾");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("對01 response 過濾");
}
@Override
public void destroy() {
System.out.println("01 調(diào)用了destroy方法");
}
}
啟動服務(wù)器控制臺輸出
進(jìn)行攔截時控制臺輸出
關(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 進(jìn)行過濾");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("對02 response 過濾");
}
@Override
public void destroy() {
System.out.println("02 調(diào)用了destroy方法");
}
}
我們可以看見Filter01先進(jìn)行過濾,然后交給Filter02,然后訪問資源,然后Filter02對響應(yīng)進(jìn)行過濾,然后Filter01對響應(yīng)進(jìn)行過濾。文章來源:http://www.zghlxwxcb.cn/news/detail-770961.html
多個Filter的執(zhí)行順序
如果我們是使用@WebFilter進(jìn)行配置的,那么執(zhí)行順序就是字符比較順序來執(zhí)行,例如有2個過濾器,一個是AFilter,一個是BFilter,那么AFilter就會先執(zhí)行。文章來源地址http://www.zghlxwxcb.cn/news/detail-770961.html
到了這里,關(guān)于Java 過濾器 @WebFilter 詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!