過濾器(Filter)和 攔截器(Interceptor)的區別
過濾器(Filter)
它依賴於servlet容器。它可以對幾乎所有請求進行過濾。使用過濾器的目的,是用來做一些過濾操作,獲取我們想要獲取的資料,比如:在Javaweb中,對傳入的request、response提前過濾掉一些資訊,或者提前設定一些引數,然後再傳入servlet或者Controller進行業務邏輯操作。
通常用的場景是:在過濾器中修改字元編碼(CharacterEncodingFilter)、在過濾器中修改HttpServletRequest的一些引數(XSSFilter(自定義過濾器)),如:過濾低俗文字、危險字元等。
攔截器(Interceptor)
它依賴於web框架,在SpringMVC中就是依賴於SpringMVC框架。在實現上,基於Java的反射機制。
屬於面向切面程式設計(AOP)的一種運用,就是在service或者一個方法前,呼叫一個方法,或者在方法後,呼叫一個方法,比如動態代理就是攔截器的簡單實現,在呼叫方法前打印出字串(或者做其它業務邏輯的操作),也可以在呼叫方法後打印出字串,甚至在丟擲異常的時候做業務邏輯的操作。
由於攔截器是基於web框架的呼叫,因此可以使用Spring的依賴注入(DI)進行一些業務操作,同時一個攔截器例項在一個controller生命週期之內可以多次呼叫。攔截器可以對靜態資源的請求進行攔截處理。
測試結果
並訪問:http://www.localhost:8080/test,看控制檯的輸出
從這個控制檯列印輸出,就可以很清晰地看到有多個攔截器和過濾器存在時的整個執行順序了。當然,對於多個攔截器它們之間的執行順序跟在SpringMVC的配置檔案中定義的先後順序有關。
總結
對於上述過濾器和攔截器的測試,可以得到如下結論:
-
Filter需要在web.xml中配置,依賴於Servlet
-
Interceptor需要在SpringMVC中配置,依賴於框架
-
Filter的執行順序在Interceptor之前,具體的流程見下圖
兩者的本質區別:攔截器(Interceptor)是基於Java的反射機制,而過濾器(Filter)是基於函式回撥。從靈活性上說攔截器功能更強大些,Filter能做的事情,都能做,而且可以在請求前,請求後執行,比較靈活。Filter主要是針對URL地址做一個編碼的事情、過濾掉沒用的引數、安全校驗(比較泛的,比如登入不登入之類),太細的話,還是建議用interceptor。不過還是根據不同情況選擇合適的。
原文連結:https://blog.csdn.net/zxd1435513775/article/details/80556034