如果監聽器、過濾器、 攔截器、 AOP都存在,則它們的執行順序為:監聽器 => 過濾器=> 攔截器=> AOP。
過濾器/攔截器/AOP
簡介
- 過濾器:Filter。攔截器:Interceptor 。
- 在Spring構架的程序中,要優先使用攔截器。幾乎所有 Filter 能夠做的事情,interceptor 都能夠輕松的實現。
- AOP:可以自定義切入的點,有方法的參數,但拿不到http請求,可以通過RequestContextHolder等方式獲得。
調用順序
過濾前=> 攔截前=> AOP=> Controller=> AOP=> 攔截后=> 過濾后
不同點
項 | 過濾器 | 攔截器 |
使用場景 | 對請求/響應進行修改、判斷等。一般用於過濾參數、登錄權限驗證、資源訪問權限控制、敏感詞匯過濾、字符編碼轉換。 | 在service或者一個方法前/后調用一個方法,或者在方法后調用一個方法。 |
能力 | 可以拿到原始的http請求與響應,拿不到請求的控制器和請求控制器中的方法的信息。 可以修改請求、響應、參數:比如:修改字符編碼、刪除低俗文字、刪除危險字符、修改參數 |
可以拿到你請求的控制器和方法,卻拿不到請求與響應。 |
順序 | 可指定順序。 | 可指定順序。 |
實現方式 | 回調函數 | AOP |
使用范圍 | 只能用於Web | 可用於Web、Application、Swing |
作用范圍 | 所有請求。 | 只能是controller請求。靜態資源無法控制。 |
使用位置 | controller前后、dispaterServlet前后 | controller前后 |
規范定義 | Servlet 規范定義,Servlet 容器支持。 Filter 接口定義在 javax.servlet 包 |
Spring容器內,Spring框架支持。 HandlerInterceptor 接口 定義在org.springframework.web.servlet 包 |
靈活性/粒度 | 靈活性差(粒度大)。 不能夠使用 Spring 容器資源 |
靈活性好(粒度小)。 能使用Spring里的任何資源、對象,例如 Service對象、數據源、事務管理等,通過IoC注入到攔截器即可。 |
打斷鏈路 | 打斷方法:處理請求和響應對象來引發中斷,需要額外的動作,比如將用戶重定向到錯誤頁面。 | 打斷方法:preHandle方法內返回 false |
執行次數 | 一個controller周期只調用一次:一個過濾器實例只能在容器初始化時調用一次。 | 一個controller周期可調用多次 |
參考文章:
https://blog.csdn.net/feiying0canglang/article/details/121387483