Spring 過濾器 攔截器 AOP區別

簡介
這幾天在回顧Spring的AOP時,對過濾器,攔截器,AOP的關係有點好奇,故記錄作以備份。在實現一些公共邏輯的時候,不少功能經過過濾器,攔截器,AOP都能實現,可是不一樣的方式有不一樣的效率。具體有什麼區別,看下文描述。web

先後端交互基本邏輯

過濾器
過濾器攔截的是URL

Spring中自定義過濾器(Filter)通常只有一個方法,返回值是void,當請求到達web容器時,會探測當前請求地址是否配置有過濾器,有則調用該過濾器的方法(可能會有多個過濾器),而後才調用真實的業務邏輯,至此過濾器任務完成。過濾器並無定義業務邏輯執行前、後等,僅僅是請求到達就執行。後端

特別注意:過濾器方法的入參有request,response,FilterChain,其中FilterChain是過濾器鏈,使用比較簡單,而request,response則關聯到請求流程,所以能夠對請求參數作過濾和修改,同時FilterChain過濾鏈執行完,而且完成業務流程後,會返回到過濾器,此時也能夠對請求的返回數據作處理。post

攔截器
攔截器攔截的是URL

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

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

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已被渲染,執行攔截器的自定義處理。blog

AOP(面向切面)
面向切面攔截的是類的元數據(包、類、方法名、參數等)

相對於攔截器更加細緻,並且很是靈活,攔截器只能針對URL作攔截,而AOP針對具體的代碼,可以實現更加複雜的業務邏輯。具體類型參照其餘博客。博客

三者使用場景
三者功能相似,但各有優點,從過濾器--》攔截器--》切面,攔截規則愈來愈細緻,執行順序依次是過濾器、攔截器、切面。通常狀況下數據被過濾的時機越早對服務的性能影響越小,所以咱們在編寫相對比較公用的代碼時,優先考慮過濾器,而後是攔截器,最後是aop。好比權限校驗,通常狀況下,全部的請求都須要作登錄校驗,此時就應該使用過濾器在最頂層作校驗;日誌記錄,通常日誌只會針對部分邏輯作日誌記錄,並且牽扯到業務邏輯完成先後的日誌記錄,所以使用過濾器不能細緻地劃分模塊,此時應該考慮攔截器,然而攔截器也是依據URL作規則匹配,所以相對來講不夠細緻,所以咱們會考慮到使用AOP實現,AOP能夠針對代碼的方法級別作攔截,很適合日誌功能。io

相關文章
相關標籤/搜索