springboot注册拦截器后swagger冲突无法访问:
由于拦截器会把所有请求都拦截下来,而swagger文档的页面资源和接口也会被拦截,因此再注册拦截器时需要将其排除.
springboot版本和swagger依赖:
<!--swagger-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>2.0.9</version>
</dependency>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath/>
</parent>
自定义拦截器
@Configuration
public class LoginHandler implements HandlerInterceptor {
@Autowired
private IUserService userService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws AuthException {
// 省略了用户识别过程 可以是token或者密码校验
if (user != null) {
UserThreadLocal.setUser(user);
return true;
}
throw new AuthException("用户身份信息异常");
}
}
拦截器注册
@Configuration
public class HandlerConfig extends WebMvcConfigurationSupport {
@Autowired // 自定义的拦截器
private LoginHandler loginHandler;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截路径可自行配置多个 可用 ,分隔开
InterceptorRegistration interceptorRegistration = registry.addInterceptor(loginHandler);
interceptorRegistration.addPathPatterns("/**"); // 需要拦截的路径
interceptorRegistration.excludePathPatterns( // 不拦截的路径
// 放行swagger相关的路径
"/swagger-ui/**",
"/swagger-resources/**",
"/v3/api-docs"
);
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//配置拦截器访问静态资源
registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/favicon.ico").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
启动后swagger和拦截器冲突问题即可解决,自测成功,欢迎讨论