控制 Swagger 的开启
在开发或者测试环境下,开启 swagger 可以让前端对接口,但是如果在生产环境下也开启swagger 的话,是会将接口暴露出去的,有极大风险,我们可以 swagger 根据不同的环境来决定是否开启
这里我们准备了四个项目的配置文件,dev
、test
、pro
三个环境的配置文件仅是端口上的不同
- application.yml -------------------------- 全局配置文件
- application-dev.yml -------------------- 开发环境配置文件
- application-test.yml -------------------- 测试环境配置文件
- application-pro.yml -------------------- 生产环境配置文件
application.yml
内容如下,指定选择的项目环境:
spring:
profiles:
active: dev
我们可以通过代码判断此时是在什么环境:dev
、test
、pro
,如果是在 pro
生产环境,则关闭 swagger。
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.env.Profiles;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
/*
*
* 接口文档生成工具
*/
@EnableSwagger2
@Configuration
public class SwaggerConfig {
@Bean
public Docket productApi(Environment environment) {
// 环境范围
Profiles profiles = Profiles.of("dev","test");
// 在该环境返回内则返回true,反之false
boolean flag = environment.acceptsProfiles(profiles);
return new Docket(DocumentationType.SWAGGER_2)
.enable(flag)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) //添加ApiOperiation注解的被扫描
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder().title("swagger和springBoot整合").description("swagger的API文档")
.version("1.0").build();
}
}
在 application.yml
全局配置文件中环境指向 dev
时,是可以打开 swagger 的
如果我将 application.yml
全局配置文件中环境指向 pro
时,就不能打开 swagger 了,提示 Not Found
添加请求头
有时候我们的接口是需要获取请求头信息的,这样的话就还需要在 swagger 配置中添加请求头的配置。
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.env.Profiles;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
/*
*
* 接口文档生成工具
*/
@EnableSwagger2
@Configuration
public class SwaggerConfig {
@Bean
public Docket productApi(Environment environment) {
// 设置请求头
List<Parameter> parameters = new ArrayList<>();
parameters.add(new ParameterBuilder()
.name("Authorization") // 字段名
.description("Authorization") // 描述
.modelRef(new ModelRef("string")) // 数据类型
.parameterType("header") // 参数类型
.defaultValue("default value") // 默认值:可自己设置
.hidden(true) // 是否隐藏
.required(true) // 是否必须
.build());
// 设置环境范围
Profiles profiles = Profiles.of("dev","test");
// 如果在该环境返回内则返回:true,反之返回 false
boolean flag = environment.acceptsProfiles(profiles);
return new Docket(DocumentationType.SWAGGER_2)
.enable(flag)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) //添加ApiOperiation注解的被扫描
.paths(PathSelectors.any())
.build()
.globalOperationParameters(parameters);
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder().title("swagger和springBoot整合").description("swagger的API文档")
.version("1.0").build();
}
}
测试