SpringBoot - 拦截器的注册和使用(附样例)
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,由于该路径被排除再外,因此就没有被拦截:
早年同窗始相知,三载瞬逝情却萌。年少不知愁滋味,犹读红豆生南国。别离方知相思苦,心田红豆根以生。