攔截器過濾器使用場景和作用

攔截器與過濾器的區別總結:

 

過濾器在web.xml中配置:

(1)因爲一開始在過濾器中映射的url-pattern填寫路徑是*.action。所有的action要經過它的過濾。<url-pattern>*.action</url-pattern>

(2)因爲在web.xml中配置了過濾器,所以,執行過程所有程序都經過struts2過濾器(路徑是:/*),首先過濾自己相關的程序,如xx.action,先處理,如果是.html或者.jsp就不會處理,直接放行。

解決方法:把過濾器映射路徑改爲:/*  ,即全部過濾處理。

<url-pattern>/*</url-pattern>

過濾器和攔截器不同,struts中攔截器是核心。

 

理解

(1)過濾器(Filter):當你有一堆東西的時候,你只希望選擇符合你要求的某一些東西。定義這些要求的工具,就是過濾器。(理解:就是一堆字母中取一個B)

(2)攔截器(Interceptor):在一個流程正在進行的時候,你希望干預它的進展,甚至終止它進行,這是攔截器做的事情。(理解:就是一堆字母中,干預他,通過驗證的少點,順便乾點別的東西)。
 

攔截器 :是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前打印出字符串(或者做其它業務邏輯的操作),也可以在你調用方法後打印出字符串,甚至在你拋出異常的時候做業務邏輯的操作。

過濾器:是在javaweb中,你傳入的request、response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts的action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者 struts的action前統一設置字符集,或者去除掉一些非法字符.。

 

攔截器與過濾器使用場景:

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

 

1、日誌記錄:記錄請求信息的日誌,以便進行信息監控、信息統計、計算PV(Page View)等。

2、權限檢查:如登錄檢測,進入處理器檢測檢測是否登錄,如果沒有直接返回到登錄頁面;

3、性能監控:有時候系統在某段時間莫名其妙的慢,可以通過攔截器在進入處理器之前記錄開始時間,在處理完後記錄結束時間,從而得到該請求的處理時間(如果有反向代理,如apache可以自動記錄);

4、通用行爲:讀取cookie得到用戶信息並將用戶對象放入請求,從而方便後續流程使用,還有如提取Locale、Theme信息等,只要是多個處理器都需要的即可使用攔截器實現。

5、OpenSessionInView:如hibernate,在進入處理器打開Session,在完成後關閉Session。

 

 

具體區別

 

攔截器是AOP( Aspect-Oriented Programming)的一種實現,底層通過動態代理模式完成。

區別:

(1)攔截器是基於java的反射機制的,而過濾器是基於函數回調。

(2)攔截器不依賴於servlet容器,而過濾器依賴於servlet容器。

(3)攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。

(4)攔截器可以訪問action上下文、值棧裏的對象,而過濾器不能。

(5)在action的生命週期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。

 

 

 兩者的本質區別:從靈活性上說攔截器功能更強大些,Filter能做的事情,他都能做,而且可以在請求前,請求後執行,比較靈活。Filter主要是針對URL地址做一個編碼的事情、過濾掉沒用的參數、安全校驗(比較泛的,比如登錄不登錄之類),太細的話,還是建議用interceptor。不過還是根據不同情況選擇合適的。


 

 

 

filter

Interceptor

多個的執行順序

根據filter mapping配置的先後順序

按照配置的順序,但是可以通過order控制順序

規範

在Servlet規範中定義的,是Servlet容器支持的

spring容器內的,是Spring框架支持的。

使用範圍

只能用於Web程序中

既可以用於Web程序,也可以用於Application、Swing程序中。

深度

Filter在只在Servlet前後起作用

攔截器能夠深入到方法前後、異常拋出前後等

 

 


 
補充說明:
    Spring的攔截器與Servlet的Filter有相似之處,比如二者都是AOP編程思想的體現,都能實現權限檢查、日誌記錄等。不同的是:

     使用範圍不同:Filter是Servlet規範規定的,只能用於Web程序中。而攔截器既可以用於Web程序,也可以用於Application、Swing程序中。
     規範不同:Filter是在Servlet規範中定義的,是Servlet容器支持的。而攔截器是在Spring容器內的,是Spring框架支持的。

使用的資源不同:同其他的代碼塊一樣,攔截器也是一個Spring的組件,歸Spring管理,配置在Spring文件中,因此能使用Spring裏的任何資源、對象,例如Service對象、數據源、事務管理等,通過IoC注入到攔截器即可;而Filter則不能。

深度不同:Filter在只在Servlet前後起作用。而攔截器能夠深入到方法前後、異常拋出前後等,因此攔截器的使用具有更大的彈性。所以在Spring構架的程序中,要優先使用攔截器。

  實際上Filter和Servlet極其相似,區別只是Filter不能直接對用戶生成響應。實際上Filter裏doFilter()方法裏的代碼就是從多個Servlet的service()方法裏抽取的通用代碼,通過使用Filter可以實現更好的複用。
  filter是一個可以複用的代碼片段,可以用來轉換HTTP請求、響應和頭信息。Filter不像Servlet,它不能產生一個請求或者響 應,它只是修改對某一資源的請求,或者修改從某一的響應。
  JSR中說明的是,按照多個匹配的Filter,是按照其在web.xml中配置的順序 來執行的。 

所以這也就是,把自己的Filter或者其他的Filter(比如UrlRewrite的Filter)放在Struts的 DispatcherFilter的前面的原因。因爲,它們需要在請求被Struts2框架處理之前,做一些前置的工作。 

        當Filter被調用,並且進入了Struts2的DispatcherFilter中 後,Struts2會按照在Action中配置的Interceptor Stack中的Interceptor的順序,來調用Interceptor。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章