美文网首页
如何在生产环境禁用Swagger

如何在生产环境禁用Swagger

作者: Joshua1919 | 来源:发表于2017-10-19 09:13 被阅读0次

SpringMVC集成springfox-swagger2和springfox-swagger-ui很简单,只需要两步:

  1. pom中添加依赖
<dependency>  
            <groupId>io.springfox</groupId>  
            <artifactId>springfox-swagger-ui</artifactId>  
            <version>${springfox-swagger.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>io.springfox</groupId>  
            <artifactId>springfox-swagger2</artifactId>  
            <version>${springfox-swagger.version}</version>  
</dependency>  
  1. 添加Swagger的配置类
@Configuration 
@EnableSwagger2 
@EnableWebMvc
@ComponentScan("com.XXX.controller")
public class SwaggerConfig{
.....
}

然后就可以通过http://localhost/swagger-ui.html看到项目中所有的接口信息了,通过http://localhost/v2/api-docs就能看到json数据。

但是,如何在生产环境禁用这些api文档呢?试了很多种方式,最终找到一个简单实用的办法:

@Configuration 
@EnableSwagger2 
@EnableWebMvc
@ComponentScan("com.XXX.controller")
public class SwaggerConfig{
    
    @Autowired
    ConfigService configService;
    
    @Bean
    public Docket customDocket() {
            if(configService.getServerEnv() == ServerEnvEnum.ONLINE) {
                return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfoOnline())
                .select()
                .paths(PathSelectors.none())//如果是线上环境,添加路径过滤,设置为全部都不符合
                .build();
            }else {
                return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo());
            }
    }

    private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                    .title("XXX系统")
                    .description("XXX系统接口")
                    .license("")
                    .licenseUrl("")
                    .termsOfServiceUrl("")
                    .version("1.0.0")
                    .contact(new Contact("","", ""))
                    .build();
    }
    private ApiInfo apiInfoOnline() {
            return new ApiInfoBuilder()
                    .title("")
                    .description("")
                    .license("")
                    .licenseUrl("")
                    .termsOfServiceUrl("")
                    .version("")
                    .contact(new Contact("","", ""))
                    .build();
    }
}

现在http://localhost/swagger-ui.html这个页面虽然还能访问,那是却看不到任何内容了,包括http://localhost/v2/api-docs也是一样。
应该还有更好的办法!

参考:http://blog.csdn.net/w4hechuan2009/article/details/68892718

swagger必须要跟springmvc在同一个context才行,springmvc只是spring的一个子context。如果swagger让spring的context加载,那么swagger的那些url用springmvc的拦截器是拦截不到的!

两种解决办法:

第一种:使用注解方式

(1)spring-mvc的配置

<!-- 使用Annotation自动注册Bean,只扫描@Controller -->  
<context:component-scan base-package="com.***" use-default-filters="false"><!-- base-package 如果多个,用“,”分隔 -->  
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>  
    <context:include-filter type="assignable" expression="com.***.SwaggerConfig"/>    
</context:component-scan>  

注意要把swagger的配置加进来,同时:

(2)spring的配置:

<!-- 包扫描、注解相关 -->  
<context:component-scan base-package="com.***.***">  
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>  
    <context:exclude-filter type="assignable" expression="com.***.SwaggerConfig"/>    
</context:component-scan> 

注意把swagger排除掉

(3)Swagger的配置:

@Configuration   
@EnableSwagger2   
@EnableWebMvc  
@ComponentScan("com.***.controller")  
public class SwaggerConfig{  
}  

注意要添加@Configuration注解。

第二种方式,也是更为推荐的方式,使用xml配置,这样还可以不用引入swagger的依赖包:

(1)spring-mvc的配置:

<!-- 使用Annotation自动注册Bean,只扫描@Controller -->  
<context:component-scan base-package="com.***" use-default-filters="false"><!-- base-package 如果多个,用“,”分隔 -->  
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>  
</context:component-scan>  
<import resource="classpath:spring-mvc-swagger.xml" />  

spring-mvc-swagger.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <description>SpringMVC Swagger Configuration</description>
    
    <!-- swagger配置,线上环境只要把这个置空就可以了 -->
    <bean class="com.***.SwaggerConfig" />
    
</beans>

注意:我们这里把swagger单独放到一个配置文件中,如果是线上环境,则文件内容为空,如果是线下测试环境,则配置上Swagger。

(2)spring的配置:

<!-- 包扫描、注解相关 -->  
    <context:component-scan base-package="com.***">  
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>  
    </context:component-scan>  

(3)Swagger的配置:

@EnableSwagger2   
@EnableWebMvc  
public class SwaggerConfig{  
  
    @Bean  
    public Docket customDocket() {  
        return new Docket(DocumentationType.SWAGGER_2)  
                .apiInfo(apiInfo())  
                .select()  
                .apis(RequestHandlerSelectors.basePackage("com.***.controller"))  
                .paths(PathSelectors.any())  
                .build();  
    }  
  
    private ApiInfo apiInfo() {  
        return new ApiInfoBuilder()  
                .title("XXX平台")  
                .description("XXX平台接口")  
                .license("")  
                .licenseUrl("")  
                .termsOfServiceUrl("")  
                .version("1.0.0")  
                .contact(new Contact("","", ""))  
                .build();  
    }  
}  

注意:这里我们去掉了@Configuration,同时,修改我们的pom,配置多profile打包:

pom.xml:

<!-- Swagger -->  
        <dependency>  
            <groupId>io.springfox</groupId>  
            <artifactId>springfox-swagger2</artifactId>  
            <version>${springfox-swagger.version}</version>  
            <scope>${swagger.scope}</scope>  
        </dependency>  
        <dependency>  
            <groupId>io.springfox</groupId>  
            <artifactId>springfox-swagger-ui</artifactId>  
            <scope>${swagger.scope}</scope>  
            <version>${springfox-swagger-ui.version}</version>  
        </dependency>  

注意:这里的依赖的scope是动态设置的,如果是线上环境,我们把scope设置成provided就可以。

<profiles>  
        <profile>  
            <id>dev</id>  
            <properties>  
                <profiles.active>dev</profiles.active>  
                <swagger.scope>compile</swagger.scope>  
            </properties>  
            <activation>  
                <activeByDefault>true</activeByDefault>  
            </activation>  
        </profile>  
        <profile>  
            <id>test</id>  
            <properties>  
                <profiles.active>test</profiles.active>  
                <swagger.scope>compile</swagger.scope>  
            </properties>  
        </profile>  
        <profile>  
            <id>online</id>  
            <properties>  
                <profiles.active>online</profiles.active>  
                <swagger.scope>provided</swagger.scope>  
            </properties>  
        </profile>  
    </profiles>  

通过不同的profile给swagger的依赖设置不同的scope!

完美!

注意:springfox-swagger.version=2.7.0有bug,可以使用低版本2.6.1。太他妈的坑!

相关文章

网友评论

      本文标题:如何在生产环境禁用Swagger

      本文链接:https://www.haomeiwen.com/subject/nqayuxtx.html