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

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

一、filter基於filter介面中的doFilter回撥函式,interceptor則基於Java本身的反射機制; 

二、filter是依賴於servlet容器的,沒有servlet容器就無法回撥doFilter方法,而interceptor與servlet無關; 

三、filter的過濾範圍比interceptor大,filter除了過濾請求外通過萬用字元可以保護頁面、圖片、檔案等,而interceptor只能過濾請求,只對action起作用,在action之前開始,在action完成後結束(如被攔截,不執行action); 

四、filter的過濾一般在載入的時候在init方法宣告,而interceptor可以通過在xml宣告是guest請求還是user請求來辨別是否過濾; 

五、interceptor可以訪問action上下文、值棧裡的物件,而filter不能; 

六、在action的生命週期中,攔截器可以被多次呼叫,而過濾器只能在容器初始化時被呼叫一次。
-----------------------------------------------------------------------------------------------------------------------------------------------------
四:interceptor可以通過在xml宣告是guest請求還是user請求來辨別是否過濾
interceptor在struts.xml配置舉例:
<package name="XXX-default" namespace="/" extends="struts-default">
        <interceptors>
            <interceptor name="authentication" class="com.util.XXXInterceptor" />
            
            <interceptor-stack name="user">
                <interceptor-ref name="defaultStack" />
                <interceptor-ref name="authentication" />
            </interceptor-stack>
            <interceptor-stack name="user-submit">
                <interceptor-ref name="user" />
                <interceptor-ref name="token" />
            </interceptor-stack>
            <interceptor-stack name="guest">
                <interceptor-ref name="defaultStack" />
            </interceptor-stack>
            <interceptor-stack name="guest-submit">
                <interceptor-ref name="defaultStack" />
                <interceptor-ref name="token" />
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="user" />
   </package>
五:interceptor可以訪問action上下文、值棧裡的物件

===================================== Filter =========================================

    filter這個角色是用來:在請求到達servlet之前,先截獲請求,對請求先做一些預處理(例如編碼轉換,許可權驗證)。處理完後在把請求轉發給servlet或把不符合某些規則的請求丟棄掉,不再轉發給servlet了。當servlet處理好請求後,返回響應給瀏覽器時,filter攔截響應,對響應做一些處理之後,再返回給瀏覽器。

    多個filter可以協同工作,它們之間採用了職責鏈的設計模式來協同工作。一個filter處理完後,呼叫下一個filter來處理,每個filter負責處理不同的工作,而這些filter之間可以根據需要靈活組合。filter的先後順序按filter在web.xml中配置的先後順序。

===================================== Interceptor =========================================
Interceptor是某些MVC框架中的角色,比如Struts2中,Interceptor是用來攔截Action中的方法的呼叫,在被攔截的Action方法被執行前,先執行響應的攔截器中的方法。interceptor:是在面向切面程式設計的,就是在你的service或者一個方法,前呼叫一個方法,或者在方法後呼叫一個方法,比如動態代理就是攔截器的簡單實現。

Java的反射機制主要功能:
    (1)在執行時判斷任意一個物件所屬的類。


    (2)在執行時構造任意一個類的物件。
    (3)在執行時判斷任意一個類所具有的成員變數和方法。
    (4)在執行時呼叫任意一個物件的方法
    前提是在執行時,不是編譯時,也就是在執行前並不知道呼叫哪一個類,通過反射就可以做到這些

代理模式的作用是:為其他物件提供一種代理以控制對這個物件的訪問。在某些情況下,一個客戶不想或者不能直接引用另一個物件,而代理物件可以在客戶端和目標物件之間起到中介的作用

切入點的概念是AOP的關鍵,它使AOP區別於其他使用攔截的技術。

spring Web MVC的處理器攔截器類似於Servlet開發中的過濾器Filter,用於對處理器進行預處理和後處理。

常見應用場景 1、日誌記錄:記錄請求資訊的日誌,以便進行資訊監控、資訊統計、計算PV(Page View)等。 2、許可權檢查:如登入檢測,進入處理器檢測檢測是否登入,如果沒有直接返回到登入頁面; 3、效能監控:有時候系統在某段時間莫名其妙的慢,可以通過攔截器在進入處理器之前記錄開始時間,在處理完後記錄結束時間,從而得到該請求的處理時間(如果有反向代理,如apache可以自動記錄); 4、通用行為:讀取cookie得到使用者資訊並將使用者物件放入請求,從而方便後續流程使用,還有如提取Locale、Theme資訊等,只要是多個處理器都需要的即可使用攔截器實現。 5、OpenSessionInView:如hibernate,在進入處理器開啟Session,在完成後關閉Session。