Spring MVC 中提供了 AOP 風格的攔截器,擁有更加精細的攔截處理能力。Spring Boot 中攔截器的注冊與使用更加方便,下面通過樣例進行演示。
1,創建攔截器
首先我們實現 HandlerInterceptor 接口自定義一個攔截器 MyInterceptor1,內容如下:
(1)攔截器中的方法將按 preHandle -> Controller -> postHandle -> afterCompletion 的順序執行,注意: 只有 preHandle 方法返回 true,postHandle、afterCompletion 才有可能被執行; 如果 preHandle 方法返回 false,則該攔截器的 postHandle、afterCompletion 必然不會被執行。 (2)當攔截器鏈內存在多個攔截器時: 其中 preHandle 方法返回 true 的攔截器的 afterCompletion 會執行。 只有所有攔截器的 preHandle 方法都返回 true,postHandle 才會執行。
import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyInterceptor1 implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor1>>>preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor1>>>postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor1>>>afterCompletion"); } }
2,配置攔截器
接着需要定義一個配置類來配置攔截器。自定義類只需實現 WebMvcConfigurer 接口,實現接口中的 addInterceptors 方法即可。
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor1()) .addPathPatterns("/**") // 配置攔截路徑(所有路徑都攔截) .excludePathPatterns("/test2"); // 配置排除的路徑 } }
contrlloer
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @Autowired String hello; @GetMapping("/test") public String test() { return hello; } @GetMapping("/test2") public String test2() { return hello; } }
3,運行測試
(1)首先我們通過瀏覽器訪問接口 http://localhost:8080/test,可以看到控制台輸出信息如下,說明攔截器成功啟用:

(2)接着訪問接口http://localhost:8080/test2,由於該路徑被排除再外,因此就沒有被攔截:
