過濾器 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 的配置文件中定義的先後順序有關。

總結 對於上述過濾器和攔截器的測試,可以得到如下結論:

兩者的本質區別:

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

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/M_gd0tD3QhfmK-xmywD1Xw