在生产环境中禁用Swagger

一、采用的方案
1. 在class中
@Configuration
//配置是否开启swagger的访问的方式一,动态读取无法使用,@active@
//@Profile({"dev", "test", "local", "uat-local"})            
//配置是否开启swagger的访问的方式二,要在yml中添加对应配置
@ConditionalOnProperty(name = "swagger.enable", havingValue = "true")      
@EnableSwagger2 //Enable swagger 2.0 spec
public class SwaggerConfig {
    
2. 在yml文件中
# 是否启用swagger,true则启用
swagger:
  enable: true  
 
二、实现方案:
 
1. @Profile({"dev", "test", "local", "uat-local"})。实际使用中,配置文件为动态设置,无法使用方案一
spring: profiles: active: @active@
2. @ConditionalOnProperty(name = "swagger.enable", havingValue = "true") 。不需要开放访问则不配置或者配置为非true
# 是否启用swagger,true则启用 swagger: enable: true
3. 在Docket中设置,体验上会比方案2友好
@Value("${swagger.enable}")
private Boolean swaggerEnable;

return new Docket(DocumentationType.SWAGGER_2)
        .enable(swaggerEnable)

# 是否启用swagger,true则启用
swagger:
  enable: true

 

4. 拦截器
@Component public class SwaggerInterceptor implements HandlerInterceptor {
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    if (StringUtils.trim(activeProfile).equals("uat") || StringUtils.trim(activeProfile).equals("prod")) {
      return false;
    } return true;
   }
...
 
@Configuration public class InterceptorConfig implements WebMvcConfigurer {
  //spring-boot 2.x 的写法
  @Override public void addInterceptors(InterceptorRegistry registry) {
    logger.info("拦截器注册", "SwaggerInterceptor", null);
    registry.addInterceptor(swaggerInterceptor).addPathPatterns(SWAGGER_UI_URL);
  }
...
5. 在nginx或者服务网关中处理
 
三、遇到的问题:
 
1. 测试过程中,方法一与方法二都无效,排查后确认原因:
  启动类中也有一个启动swagger的配置,所以在SwaggerConfig中失效的情况下,依然有效
@EnableSwagger2 public class Application
  解决方法:注释掉//@EnableSwagger2

posted on 2020-12-18 09:34  weijs  阅读(3531)  评论(0编辑  收藏  举报

导航