目录
笔者在工作经常遇到要将写接口文档给 第三方,虽然 有javadoc 自动生成的工具,但是 大部分人希望能在 web浏览器上看到,这样更方便,所以选择 swagger2,同时又有人提出在生产环境不希望能看到这个 swagger的界面,所以还需要限制,总有人 觉得生产环境应该安全,安全,但是 我再思考 别人如果有心web渗透,你放防不住的。
步骤
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
实施
@ConditionalOnExpression(“${swagger.show}”) 这个 注解 就是如果 expression成立,那么就会 加载这个配置 类,
swagger.show=true # dev test pro 肯定配置不一样
@Configuration //让Spring来来 加载该类 配置
@ConditionalOnExpression("${swagger.show}")
public class Swagger2 {
/**
* 定义api组,
*/
@Bean
public Docket innerApi() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("innerApi")
.genericModelSubstitutes(DeferredResult.class)
.useDefaultResponseMessages(false)
.forCodeGeneration(true)
.select()
.apis(RequestHandlerSelectors.basePackage("com.jufan.install.controller"))
.paths(PathSelectors.any())
.build()
.apiInfo(innerApiInfo());
}
@Bean
public Docket openApi() {
Predicate<RequestHandler> predicate = new Predicate<RequestHandler>() {
@Override
public boolean apply(RequestHandler input) {
if (input.isAnnotatedWith(ApiOperation.class))//只有添加了ApiOperation注解的method才在API中显示
return true;
return false;
}
};
return new Docket(DocumentationType.SWAGGER_2)
.groupName("openApi")
.genericModelSubstitutes(DeferredResult.class)
.useDefaultResponseMessages(false)
.forCodeGeneration(false)
.select()
.apis(predicate)
.paths(PathSelectors.any())//过滤的接口
.build()
.apiInfo(openApiInfo());
}
private ApiInfo innerApiInfo() {
return new ApiInfoBuilder()
.title("进件系统")//大标题
.description("内部api")//详细描述
.version("1.0")//版本
.termsOfServiceUrl("NO terms of service")
.contact(new Contact("金", "https://www.baidu.com", "787591269@qq.com"))//作者
.license("你的指尖拥有改变世界的力量")
.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")
.build();
}
private ApiInfo openApiInfo() {
return new ApiInfoBuilder()
.title("进件系统")//大标题
.description("进件团队提供 ~ 对外的api文档")//详细描述
.version("1.0")//版本
.termsOfServiceUrl("NO terms of service")
.contact(new Contact("dengfu","www.baidu.com", "787591269@qq.com"))//作者
.license("你的指尖拥有改变世界的力量")
.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")
.build();
}
}
在拦截器放开
基本上所有项目都会在 spring boot ,spring 项目中自己 加上 拦截器,所以你需要将这个 放开,因为 swagger生成的ui界面 是动态生成的,
preHandle(){
if(currUrl.contains("/swagger-resources")){
return true;
}
}