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"); } }