文章目錄
- 過濾器的編寫:
- 過濾器 API
- Filter
- FilterConfig
- FilterChain
- 生命周期
- 過濾器核心方法的細節
- 多個過濾器執行順序
- <br />
過濾器——Filter,它是JavaWeb三大組件之一。另外兩個是Servlet和Listener。
它是在2000年發布的Servlet2.3規范中加入的一個接口。是Servlet規范中非常實用的技術。
它可以對web應用中的所有資源進行攔截,并且在攔截之后進行一些特殊的操作。
常見應用場景:URL級別的權限控制;過濾敏感詞匯;中文亂碼問題等等。
過濾器的編寫:
@WebFilter(filterName = "FilterDemo2",urlPatterns = "/*")
public class FilterDemo1 implements Filter {/*** 過濾器的核心方法* @param request* @param response* @param chain* @throws IOException* @throws ServletException*/@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {/*** 如果不寫此段代碼,控制臺會輸出兩次:FilterDemo1攔截到了請求。*/HttpServletRequest req = (HttpServletRequest) request;String requestURI = req.getRequestURI();if (requestURI.contains("favicon.ico")) {return;}System.out.println("FilterDemo1攔截到了請求");}
}
過濾器 API
Filter
返回類型 方法 簡介
void init(FilterConfig conf) 用于執行過濾器的初始化工作,web容器會在web項目啟動時自動調用該方法。
void doFilter(ServletRequest request,SerlvetResponse response,FilterChain chain) 當請求和響應被過濾器攔截后,都會交給doFilter來處理:其中兩個參數分別是被攔截request和response對象,可以使用chain的doFliter方法來放行。
void destroy() 用于釋放關閉Filter對象打開的資源,在web項目關閉時,由web容器自動調用該方法。
FilterConfig
FilterChain
生命周期
出生當應用加載的時候執行實例化和初始化方法。
活著只要應用一直提供服務,對象就一直存在。
死亡當應用卸載時,或者服務器宕機時,對象消亡。
Filter的實例對象在內存中也只有一份。所以也是單例的。
過濾器核心方法的細節
/*** 過濾器的核心方法*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {/*** 如果不寫此段代碼,控制臺會輸出兩次:FilterDemo1攔截到了請求。HttpServletRequest req = (HttpServletRequest) request;String requestURI = req.getRequestURI();if (requestURI.contains("favicon.ico")) {return;}*/System.out.println("FilterDemo1攔截到了請求");//過濾器放行chain.doFilter(request, response);System.out.println("FilterDemo1放行之后,又回到了doFilter方法");
}
測試運行結果,我們發現過濾器放行之后執行完目標資源,仍會回到過濾器中:
多個過濾器執行順序
運行結果