拦截器在项目中使用的是非常多的(但不是绝对的),比如拦截一些置顶的 url,做一些判断和处理等等。除此之外,还需要将常用的静态页面或者 swagger 页面放行,不能将这些静态资源给拦截了。首先先自定义一个拦截器。
public class MyInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(MyInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("执行方法之前执行(Controller方法调用之前)");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.info("执行完方法之后执行(Controller方法调用之后),但是此时还没有进行试图渲染");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.info("整个请求都处理完,DispatcherServlet也渲染了对应的视图,此时我可以做一些清理的工作");
}
}
然后将自定义的拦截器加入到拦截器配置中
@Configuration
public class MyInterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//实现WebMvcConfigurer不会导致静态资源被拦截
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**") //拦截所有url
.excludePathPatterns("/swagger-resources/**"); //放行swagger
}
}
在 Spring Boot 中,我们通常会在如下目录里存放一些静态资源:
classpath:/static
classpath:/public
classpath:/resources
classpath:/META-INF/resources
上面代码中配置的 /**
是对所有url
都进行了拦截,但我们实现了 WebMvcConfigurer
接口,不会导致 Spring Boot
对上面这些目录下的静态资源实施拦截。但是我们平时访问的 swagger
会被拦截,所以要将其放行。swagger
页面在 swagger-resources
目录下,放行该目录下所有文件即可。然后在浏览器中输入一下 swagger
页面,若能正常显示 swagger
,说明放行成功。同时可以根据后台打印的日志判断代码执行的顺序。