在将springMVC的项目改造成SpringBoot项目的过程中,遇到了token拦截器无法加载的问题。排查发现,写token拦截器之前先加入了swagger的配置文件,为防止后面加入拦截器导致swagger被拦截而无法访问,所以将swagger的配置类也写成了一个拦截器,并且该拦截器实现的是WebMvcConfigurationSupport
,导致无论怎么样更改token拦截器配置类的包的位置或者在引导类上配置@Component
,都只能访问到swagger的配置所在的拦截器
更改:
1. swagger配置类:
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.host("localhost:8080")
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.XXX.YYY.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("管理系统")
.description("管理系统接口文档")
.version("5.1")
.build();
}
- 统一拦截器
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
@Autowired
private TokenInterceptor tokenInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
System.out.println(BaseVar.STRART_WITH +"进入拦截配置类");
// 注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效
InterceptorRegistration registration = registry.addInterceptor(tokenInterceptor);
registration.addPathPatterns("/**");
registration.excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**",
"我们自己要放开的apis");
System.out.println(BaseVar.STRART_WITH +"配置拦截或放行成功");
}
注意:
拦截器的配置类有几种实现方式,常用的有:
implements WebMvcConfigurer
extends WebMvcConfigurationSupport
如果你使用的是方式一来放开swagger访问,那么你按照上面的代码来实现就可以,如果你使用的是方式2 ,那么你需要额外配置开放静态资源,代码如下
@Configuration
public class WebConfigurer extends WebMvcConfigurationSupport {
@Autowired
private TokenInterceptor tokenInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
System.out.println(BaseVar.STRART_WITH +"进入拦截配置类");
// 注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效
InterceptorRegistration registration = registry.addInterceptor(tokenInterceptor);
registration.addPathPatterns("/**");
registration.excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**",
"我们自己要放开的apis");
System.out.println(BaseVar.STRART_WITH +"配置拦截或放行成功");
}
/**
* 解决静态资源问题
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
System.out.println(BaseVar.STRART_WITH + "开始设置静态资源");
// 解决swagger无法访问
registry.addResourceHandler("/swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
// 解决swagger的js文件无法访问
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
// 解决静态资源无法访问
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/static/");
}
}