1.SpringMVC提供了AOP风格的拦截器,拥有更加精细的拦截处理能力,Springboot中拦截器的注册更加方便。步骤如下:
(1)创建一个Springboot项目,添加spring-boot-starter-web 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
上述没有用springboot默认的JSON解析器jackson 如果不需要可以不配置,请自行去掉。
(2)创建拦截器实现HandlerInterceptor接口,代码如下:
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时,后面的方法才会被执行,不然会卡死!当拦截器链内存在多个拦截器时,postHandler在拦截器链内的所有拦截器返回成功时才会调用,而afterCompletion 只有preHandle返回true才调用,若拦截器链内的第一个拦截器的preHandle方法返回false,后面的方法都不会执行。
(3)配置拦截器。定义配置类进行拦截器的配置。代码如下:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/book");
}
}
自定义类实现WebMvcConfigurer接口,实现接口中的addInterceptors方法,其中addPathPatterns表示拦截路径,
excludePathPatterns表示排除的路径