天天看點

Spring Boot 過濾器 攔截器 AOP差別

簡介

這幾天在回顧Spring的AOP時,對過濾器,攔截器,AOP的關系有點好奇,故記錄做以備份。在實作一些公共邏輯的時候,很多功能通過過濾器,攔截器,AOP都能實作,但是不同的方式有不同的效率。具體有什麼差別,看下文描述。

前後端互動基本邏輯

Spring Boot 過濾器 攔截器 AOP差別

過濾器

過濾器攔截的是URL

Spring中自定義過濾器(Filter)一般隻有一個方法,傳回值是void,當請求到達web容器時,會探測目前請求位址是否配置有過濾器,有則調用該過濾器的方法(可能會有多個過濾器),然後才調用真實的業務邏輯,至此過濾器任務完成。過濾器并沒有定義業務邏輯執行前、後等,僅僅是請求到達就執行。

特别注意:過濾器方法的入參有request,response,FilterChain,其中FilterChain是過濾器鍊,使用比較簡單,而request,response則關聯到請求流程,是以可以對請求參數做過濾和修改,同時FilterChain過濾鍊執行完,并且完成業務流程後,會傳回到過濾器,此時也可以對請求的傳回資料做處理。

攔截器

攔截器攔截的是URL

**攔截器有三個方法,相對于過濾器更加細緻,有被攔截邏輯執行前、後等。**Spring中攔截器有三個方法:preHandle,postHandle,afterCompletion。分别表示如下

public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o)表示被攔截的URL對應的方法執行前的自定義處理

public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView)表示此時還未将modelAndView進行渲染,被攔截的URL對應的方法執行後的自定義處理,。

public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e)表示此時modelAndView已被渲染,執行攔截器的自定義處理。

AOP(面向切面)

面向切面攔截的是類的中繼資料(包、類、方法名、參數等)

**相對于攔截器更加細緻,而且非常靈活,攔截器隻能針對URL做攔截,而AOP針對具體的代碼,能夠實作更加複雜的業務邏輯。**具體類型參照其他部落格。

三者使用場景

三者功能類似,但各有優勢,從過濾器–》攔截器–》切面,攔截規則越來越細緻,執行順序依次是過濾器、攔截器、切面。一般情況下資料被過濾的時機越早對服務的性能影響越小,是以我們在編寫相對比較公用的代碼時,優先考慮過濾器,然後是攔截器,最後是aop。比如權限校驗,一般情況下,所有的請求都需要做登陸校驗,此時就應該使用過濾器在最頂層做校驗;日志記錄,一般日志隻會針對部分邏輯做日志記錄,而且牽扯到業務邏輯完成前後的日志記錄,是以使用過濾器不能細緻地劃分子產品,此時應該考慮攔截器,然而攔截器也是依據URL做規則比對,是以相對來說不夠細緻,是以我們會考慮到使用AOP實作,AOP可以針對代碼的方法級别做攔截,很适合日志功能。

————————————————

版權聲明:本文為CSDN部落客「Mote_」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/dreamwbt/article/details/82658842

繼續閱讀