1. 程式人生 > >Spring 過濾器 攔截器 AOP區別

Spring 過濾器 攔截器 AOP區別

簡介

這幾天在回顧Spring的AOP時,對過濾器,攔截器,AOP的關係有點好奇,故記錄做以備份。在實現一些公共邏輯的時候,很多功能通過過濾器,攔截器,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可以針對程式碼的方法級別做攔截,很適合日誌功能。