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。