Java過濾器Filter詳解
Filter學(xué)習(xí)
Filter功能
- 攔截jsp、靜態(tài)圖片文件、靜態(tài)html資源文件
- 實現(xiàn)URL級別的權(quán)限訪問控制
- 過濾敏感詞匯
- 壓縮相應(yīng)信息
Filter的工作原理
看源碼可以看出來,F(xiàn)ilter接口中有3個方法:init、doFilter、destory

init方法,初始化Filter,F(xiàn)ilter在服務(wù)器啟動階段被實例化。并且調(diào)用init方法,init方法只執(zhí)行一次,因為Filter只被實例化一次。
destory方法也好理解,就是銷毀Filter,釋放內(nèi)存,在運行結(jié)束時調(diào)用此方法當(dāng)。長時間沒有用戶訪問,或者項目重新部署,或者服務(wù)器重新啟動的時候,會銷毀所有的Filter對象,銷毀之前會先調(diào)用Filter對象的destroy方法,完成銷毀前的準(zhǔn)備工作。也是只執(zhí)行一次。
doFilter方法提供給開發(fā)者重寫過濾邏輯。
多個Filter的實現(xiàn)
public class AFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("輸出filter2的init方法");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpServletRequest request = (HttpServletRequest) servletRequest;
System.out.println("輸出filter2的doFilter方法之前");
filterChain.doFilter(request, response);
System.out.println("輸出filter2的doFilter方法之后");
}
@Override
public void destroy() {
System.out.println("輸出filter2的destroy方法");
}
}
public class BFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("輸出filter1的init方法");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpServletRequest request = (HttpServletRequest) servletRequest;
System.out.println("輸出filter1的doFilter方法之前");
filterChain.doFilter(request, response);
System.out.println("輸出filter1的doFilter方法之后");
}
@Override
public void destroy() {
System.out.println("輸出filter1的destroy方法");
}
}
配置Filter的過濾順序,通過setOrder方法執(zhí)行FilterChain的順序,數(shù)字越小,優(yōu)先級越高。
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean filter1() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
AFilter aFilter = new AFilter();
filterRegistrationBean.setFilter(aFilter);
filterRegistrationBean.setOrder(1);
return filterRegistrationBean;
}
@Bean
public FilterRegistrationBean filter2() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
BFilter bFilter = new BFilter();
filterRegistrationBean.setFilter(bFilter);
filterRegistrationBean.setOrder(2);
return filterRegistrationBean;
}
}
Filter的執(zhí)行邏輯

總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
springcloud gateway設(shè)置context-path的操作
這篇文章主要介紹了springcloud gateway設(shè)置context-path的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
Java 使用Socket正確讀取數(shù)據(jù)姿勢
這篇文章主要介紹了Java 使用Socket正確讀取數(shù)據(jù)姿勢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
Java刪除指定文件夾下的所有內(nèi)容的方法(包括此文件夾)
下面小編就為大家?guī)硪黄狫ava刪除指定文件夾下的所有內(nèi)容的方法(包括此文件夾) 。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
java基礎(chǔ)篇之Date類型最常用的時間計算(相當(dāng)全面)
這篇文章主要給大家介紹了關(guān)于java基礎(chǔ)篇之Date類型最常用的時間計算的相關(guān)資料,Java中的Date類是用來表示日期和時間的類,它提供了一些常用的方法來處理日期和時間的操作,需要的朋友可以參考下2023-12-12
SpringBoot?整合?Quartz?定時任務(wù)框架詳解
這篇文章主要介紹了SpringBoot整合Quartz定時任務(wù)框架詳解,Quartz是一個完全由Java編寫的開源作業(yè)調(diào)度框架,為在Java應(yīng)用程序中進(jìn)行作業(yè)調(diào)度提供了簡單卻強大的機(jī)制2022-08-08

