Filter 概念簡單介紹

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)); 
}
}