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)用此方法當。長時間沒有用戶訪問,或者項目重新部署,或者服務(wù)器重新啟動的時候,會銷毀所有的Filter對象,銷毀之前會先調(diào)用Filter對象的destroy方法,完成銷毀前的準備工作。也是只執(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)文章
關(guān)于SpringBoot的spring.factories文件詳細說明
spring.factories 文件是 Spring Boot 自動配置機制的核心部分之一,它位于每個 Spring Boot 自動配置模塊的 META-INF 目錄下,經(jīng)??吹?nbsp;spring.factories 文件,卻沒有對它進行深入的了解和分析,今天我們就一起揭開面紗看看它的內(nèi)在,需要的朋友可以參考下2024-12-12
解決feignClient調(diào)用時獲取返回對象類型匹配的問題
這篇文章主要介紹了解決feignClient調(diào)用時獲取返回對象類型匹配的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

