1.Filter: servlet過濾器,如下摘自別人的文章java
Java中的Filter 並非一個標準的Servlet ,它不能處理用戶請求,也不能對客戶端生成響應。 主要用於對HttpServletRequest 進行預處理,也能夠對HttpServletResponse 進行後處理,是個典型的處理鏈。服務器
Filter可認爲是Servlet的一種「變種」,它主要用於對用戶請求進行預處理,也能夠對HttpServletResponse進行後處理,是個典型的處理鏈。它與Servlet的區別在於:它不能直接向用戶生成響應。完整的流程是:Filter對用戶請求進行預處理,接着將請求交給Servlet進行處理並生成響應,最後Filter再對服務器響應進行後處理。this
本身的理解:filter只是起到對用戶請求預處理和後處理的做用。後期再把請求交給servlet。日誌
優勢:過濾鏈的好處是,執行過程當中任什麼時候候均可以打斷,只要不執行chain.doFilter()就不會再執行後面的過濾器和請求的內容。而在實際使用時,就要特別注意過濾鏈的執行順序問題code
2.過濾器的做用描述對象
在HttpServletRequest 到達Servlet 以前,攔截客戶的HttpServletRequest 。 get
根據須要檢查HttpServletRequest ,也能夠修改HttpServletRequest 頭和數據。 servlet
在HttpServletResponse 到達客戶端以前,攔截HttpServletResponse 。 it
根據須要檢查HttpServletResponse ,能夠修改HttpServletResponse 頭和數據。io
3.具體使用看下面的小demo (關於日誌記錄的)
代碼 public class LogFilter implements Filter { //FilterConfig可用於訪問Filter的配置信息 private FilterConfig config; //實現初始化方法 public void init(FilterConfig config) { this.config = config; } //實現銷燬方法 public void destroy() { this.config = null; } //執行過濾的核心方法 public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)throws IOException,ServletException { //---------下面代碼用於對用戶請求執行預處理--------- //獲取ServletContext對象,用於記錄日誌 ServletContext context = this.config.getServletContext(); long before = System.currentTimeMillis(); System.out.println("開始過濾..."); //將請求轉換成HttpServletRequest請求 HttpServletRequest hrequest = (HttpServletRequest)request; //記錄日誌 context.log("Filter已經截獲到用戶的請求地址: " + hrequest.getServletPath()); //Filter只是鏈式處理,請求依然放行到目的地址 chain.doFilter(request, response); //---------下面代碼用於對服務器響應執行後處理--------- long after = System.currentTimeMillis(); //記錄日誌 context.log("過濾結束"); //再次記錄日誌 context.log("請求被定位到" + hrequest.getRequestURI() + "所花的時間爲: " + (after - before)); } }