1. 程式人生 > >過濾器(Filter)與攔截器(Interceptor)區別

過濾器(Filter)與攔截器(Interceptor)區別

過濾器(Filter)與攔截器(Interceptor)區別

過濾器(Filter)

Servlet中的過濾器Filter是實現了javax.servlet.Filter介面的伺服器端程式,主要的用途是設定字符集、控制權限、控制轉向、做一些業務邏輯判斷等。其工作原理是,只要你在web.xml檔案配置好要攔截的客戶端請求,它都會幫你攔截到請求,此時你就可以對請求或響應(Request、Response)統一設定編碼,簡化操作;同時還可進行邏輯判斷,如使用者是否已經登陸、有沒有許可權訪問該頁面等等工作。它是隨你的web應用啟動而啟動的,只初始化一次,以後就可以攔截相關請求,只有當你的web應用停止或重新部署的時候才銷燬。

Filter可以認為是Servlet的一種“加強版”,它主要用於對使用者請求進行預處理,也可以對HttpServletResponse進行後處理,是個典型的處理鏈。Filter也可以對使用者請求生成響應,這一點與Servlet相同,但實際上很少會使用Filter向用戶請求生成響應。使用Filter完整的流程是:Filter對使用者請求進行預處理,接著將請求交給Servlet進行處理並生成響應,最後Filter再對伺服器響應進行後處理。

Filter有如下幾個用處。

在HttpServletRequest到達Servlet之前,攔截客戶的HttpServletRequest。

根據需要檢查HttpServletRequest,也可以修改HttpServletRequest頭和資料。

在HttpServletResponse到達客戶端之前,攔截HttpServletResponse。

根據需要檢查HttpServletResponse,也可以修改HttpServletResponse頭和資料。

Filter有如下幾個種類。

使用者授權的Filter:Filter負責檢查使用者請求,根據請求過濾使用者非法請求。

日誌Filter:詳細記錄某些特殊的使用者請求。

負責解碼的Filter:包括對非標準編碼的請求解碼。

能改變XML內容的XSLT Filter等。

Filter可以負責攔截多個請求或響應;一個請求或響應也可以被多個Filter攔截。

 建立一個Filter只需兩個步驟

  1. 建立Filter處理類
  2. web.xml檔案中配置Filter

   建立Filter必須實現javax.servlet.Filter介面,在該介面中定義瞭如下三個方法。

  • void init(FilterConfig config):用於完成Filter的初始化。
  • void destory():用於Filter銷燬前,完成某些資源的回收。
  • void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):實現過濾功能,該方法就是對每個請求及響應增加的額外處理。該方法可以實現對使用者請求進行預處理(ServletRequest request),也可實現對伺服器響應進行後處理(ServletResponse response)—它們的分界線為是否呼叫了chain.doFilter(),執行該方法之前,即對使用者請求進行預處理;執行該方法之後,即對伺服器響應進行後處理。
  • 攔截器是在面向切面程式設計中應用的,就是在你的service或者一個方法前呼叫一個方法,或者在方法後呼叫一個方法。是基於JAVA的反射機制。攔截器不是在web.xml,比如struts在struts.xml中配置。
  • 攔截器(Interceptor)使用

    interceptor 的執行順序大致為:

    1. 請求到達 DispatcherServlet
    2. DispatcherServlet 傳送至 Interceptor ,執行 preHandle
    3. 請求達到 Controller
    4. 請求結束後,postHandle 執行

    Spring 中主要通過 HandlerInterceptor 介面來實現請求的攔截,實現 HandlerInterceptor 介面需要實現下面三個方法:

    • preHandle() – 在handler執行之前,返回 boolean 值,true 表示繼續執行,false 為停止執行並返回。
    • postHandle() – 在handler執行之後, 可以在返回之前對返回的結果進行修改
    • afterCompletion() – 在請求完全結束後呼叫,可以用來統計請求耗時等等