在Spring中,當一個請求到來,我們可以對其進行預處理,以及對返回的結果進行再加工。Spring提供了三個不同的工具來實現這個功能,分別對應不同的場景,剛好有個項目里都用到了,總結一下。
三種功能簡介
過濾器
實現方法
需要實現 javax.servlet.Filter 接口,或者繼承 org.springframework.web.filter.OncePerRequestFilter 類,並注冊該過濾器(@WebFilter),並在該注解中指定需要攔截哪些請求。
可捕獲的參數
- request : 請求的參數,可以通過HttpServletRequestWrapper來修改傳入的URI、頭信息等;
- response : 返回體
- filterChain : 過濾鏈(待補充)
攔截器
實現方法
需要實現 org.springframework.web.servlet.HandlerInterceptor 接口,並在 WebMvcConfigurer 中調用addInterceptors 添加攔截器和對應的攔截路徑。
可捕獲的參數
- request : 請求的參數,可以通過HttpServletRequestWrapper來修改傳入的URI、頭信息等;
- response : 返回體
- handler :
切面
實現方法
使用@Aspect標記為切面類,使用@Pointcut和@Around、@Before、@After、@AfterReturning、@AfterThrowing來確定攔截位置。
可捕獲的參數
對應方法的參數
三種的區別
- 執行順序:過濾器->攔截器->切面
- 過濾器、攔截器屬於請求層面的攔截;切面屬於方法層面的攔截