Java過濾器Filter詳解
Filter學習
Filter功能
- 攔截jsp、靜態(tài)圖片文件、靜態(tài)html資源文件
- 實現(xiàn)URL級別的權限訪問控制
- 過濾敏感詞匯
- 壓縮相應信息
Filter的工作原理
看源碼可以看出來,F(xiàn)ilter接口中有3個方法:init、doFilter、destory
init方法,初始化Filter,F(xiàn)ilter在服務器啟動階段被實例化。并且調(diào)用init方法,init方法只執(zhí)行一次,因為Filter只被實例化一次。
destory方法也好理解,就是銷毀Filter,釋放內(nèi)存,在運行結束時調(diào)用此方法當。長時間沒有用戶訪問,或者項目重新部署,或者服務器重新啟動的時候,會銷毀所有的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í)行邏輯
總結
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!
相關文章
springcloud gateway設置context-path的操作
這篇文章主要介紹了springcloud gateway設置context-path的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07Java 使用Socket正確讀取數(shù)據(jù)姿勢
這篇文章主要介紹了Java 使用Socket正確讀取數(shù)據(jù)姿勢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10Java刪除指定文件夾下的所有內(nèi)容的方法(包括此文件夾)
下面小編就為大家?guī)硪黄狫ava刪除指定文件夾下的所有內(nèi)容的方法(包括此文件夾) 。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12