過濾器filter和攔截器interceptor的比較
之前看過一篇博客有這麼一句話:
過濾器是取你所想,攔截器是拒你所不想
但其實兩者都可以理解爲起過濾的作用。
具體區別而言,總結有如下幾點:
方面 | filter | interceptor |
---|---|---|
實現原理 | 基於函數回調 | java反射,動態代理 |
是否依賴servlet | java原生,依賴servlet | spring框架所有,不依賴servlet |
作用範圍 | 所有的url,可以配置 | 無法配置url,只是針對實現某接口的類的方法在其前後進行處理,這也正是動態代理的邏輯 |
是否可以自動注入context中的bean | 不能,但可以通過getBean方法獲得 | 可以 |
如何選擇 | 在純Java的應用中儘量選擇filter,減小第三方 | 在spring應用中官方推薦interceptor |
執行順序
過濾器 -> 攔截器 -> aop -> 業務邏輯 -> 攔截器的post方法 -> filter的destroy
使用場景
-
日誌記錄:記錄請求相關的日誌,容易進行統計和監控。
-
權限檢查:如登錄檢測 。
-
性能監控或者問題排查:攔截器可以在某個方法執行前後進行處理,通過攔截器可以將一個請求的調用鏈每個環節的時間打印出來進行問題排查,當然現在可以使用APM;
-
通用行爲:獲取一些全局需要的信息,例如通過token獲得用戶信息,將用戶信息放在securityContext中,通過@ModelAttribure直接在controller中使用。
推薦閱讀:
@ModelAttribute實踐總結