SpringMVC 中提供了AOP風格的攔截器, 擁有更加精細的攔截處理能力。 Spring Boot中攔截器的註冊則更加方便, 步驟:
- 創建SpringBoot項目, 添加spring-boot-starter-web依賴。
- 創建攔截器實現HandleInterceptor接口, 代碼如下:
-
/** * 全局攔截器 */ public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor>>>preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor>>>postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor>>>afterCompletion"); } }
說明: 攔截器中的preHandle -> Controller -> postHandle -> afterCompletion 的順序執行, 注意, 只有preHandle方法返回true時後面的方法纔會執行。當攔截器鏈內存在多個攔截器時, postHandle 在攔截器鏈內的所有攔截器返回時纔會調用, 而afterCompletion 只有preHandle返回true才調用, 但若攔截器鏈內的第一個攔截器的preHandle方法返回false, 則後面的方法不會執行。
- 配置攔截器。定義配置類進行攔截器的配置, 代碼如下:
-
@Configuration public class WebMvcConfig implements WebMvcConfigurer { /** * 攔截器配置文件 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()) .addPathPatterns("/**")//攔截路徑 .excludePathPatterns("/hello")//排除路徑 .excludePathPatterns("/*.png"); } }