swagger2
1、引入依赖
io.springfox springfox-swagger2 2.9.2 io.springfox springfox-swagger-ui 2.9.2
2、Swagger配置
package com.zb.myswagger2;import com.google.common.collect.Lists;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import springfox.documentation.builders.ApiInfoBuilder;import springfox.documentation.builders.PathSelectors;import springfox.documentation.builders.RequestHandlerSelectors;import springfox.documentation.service.*;import springfox.documentation.spi.DocumentationType;import springfox.documentation.spi.service.contexts.SecurityContext;import springfox.documentation.spring.web.plugins.Docket;import springfox.documentation.swagger.web.SecurityConfiguration;import springfox.documentation.swagger.web.SecurityConfigurationBuilder;import springfox.documentation.swagger2.annotations.EnableSwagger2;import java.util.Arrays;import java.util.List;/** * Created by zhangbin on 2018/12/19. */@Configuration@EnableSwagger2public class Swagger { //指定扫描哪些包 @Bean public Docket createRestApi(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(swaggeInfo()) .select() //要扫描的包路径 .apis(RequestHandlerSelectors.basePackage("com.zb.myswagger2.controller")) .paths(PathSelectors.any()) .build(); } //配置swagger的基本信息 private ApiInfo swaggeInfo(){ return new ApiInfoBuilder() .title("Spring Boot 测试使用 Swagger2") //创始人 .contact(new Contact("swagger-git","https://github.com/swagger-api/swagger-ui/","")) //版本 .version("1.0") //描述 .description("API 描述") .build(); }}
3、在Controller接口上配置说明
@RestController@Api(value = "系统相关的接口")public class HomeController { @ApiOperation(value = "查看系统信息",notes = "查看系统信息") @RequestMapping(value = "/home", method = {RequestMethod.POST, RequestMethod.GET}) @ResponseBody public String home(){ return "Hello Swagger2!"; }}
4、在网页查看
url:http://localhost:8080/swagger-ui.html
5、权限配置
在Swagger类里面加权限相关信息,如下
package com.zb.myswagger2;import com.google.common.collect.Lists;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import springfox.documentation.builders.ApiInfoBuilder;import springfox.documentation.builders.PathSelectors;import springfox.documentation.builders.RequestHandlerSelectors;import springfox.documentation.service.*;import springfox.documentation.spi.DocumentationType;import springfox.documentation.spi.service.contexts.SecurityContext;import springfox.documentation.spring.web.plugins.Docket;import springfox.documentation.swagger.web.SecurityConfiguration;import springfox.documentation.swagger.web.SecurityConfigurationBuilder;import springfox.documentation.swagger2.annotations.EnableSwagger2;import java.util.Arrays;import java.util.List;/** * Created by zhangbin on 2018/12/19. */@Configuration@EnableSwagger2public class Swagger { //指定扫描哪些包 @Bean public Docket createRestApi(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(swaggeInfo()) .select() //要扫描的包路径 .apis(RequestHandlerSelectors.basePackage("com.zb.myswagger2.controller")) .paths(PathSelectors.any()) .build() .securitySchemes(Lists.newArrayList(apiKey())) .securityContexts(Arrays.asList(securityContext())); } //配置swagger的基本信息 private ApiInfo swaggeInfo(){ return new ApiInfoBuilder() .title("Spring Boot 测试使用 Swagger2") //创始人 .contact(new Contact("swagger-git","https://github.com/swagger-api/swagger-ui/","")) //版本 .version("1.0") //描述 .description("API 描述") .build(); } @Bean public SecurityConfiguration security() { return SecurityConfigurationBuilder.builder().scopeSeparator(",") .additionalQueryStringParams(null) .useBasicAuthenticationWithAccessCodeGrant(false).build(); } private ApiKey apiKey() { return new ApiKey("apiKey", "Authorization", "header"); } private SecurityContext securityContext() { return SecurityContext.builder().securityReferences(defaultAuth()) .forPaths(PathSelectors.any()).build(); } private ListdefaultAuth() { AuthorizationScope authorizationScope = new AuthorizationScope( "global", "accessEverything"); AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; authorizationScopes[0] = authorizationScope; return Arrays.asList(new SecurityReference("apiKey", authorizationScopes)); }}
在Filter里面过滤swagger相关url
package com.zb.myswagger2.filter;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/** * */@WebFilter(filterName = "TokenFilter", urlPatterns = {"/*"}, asyncSupported = true)public class TokenFilter implements Filter { private static final Logger logger = LoggerFactory.getLogger(TokenFilter.class); String[] includeUrls = new String[]{"/"}; @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)servletRequest; HttpServletResponse response = (HttpServletResponse)servletResponse; String url = request.getRequestURI(); logger.info("current_url: {}", url); boolean needFilter = isNeedFilter(url); //静态资源放行 if(url.endsWith(".js")||url.endsWith(".css")||url.endsWith(".jpg") ||url.endsWith(".gif")||url.endsWith(".png")){ filterChain.doFilter(servletRequest, servletResponse); return; } //swagger if(url.startsWith("/webjars") || url.startsWith("/v2") || url.startsWith("/swagger-resources") || url.startsWith("/csrf") || "/swagger-ui.html".equals(url) ){ filterChain.doFilter(servletRequest, servletResponse); return; } if(!needFilter){ filterChain.doFilter(servletRequest, servletResponse); } else { String token = request.getHeader("Authorization"); // TODO 替换项目自己的校验 if("token".equals(token)){ filterChain.doFilter(servletRequest, servletResponse); } else { response.setContentType("text/html;charset=utf-8"); response.getWriter().write("您还没有权限!"); } } } @Override public void destroy() { } public boolean isNeedFilter(String uri) { for (String includeUrl : includeUrls) { if(includeUrl.equals(uri)) { return false; } } return true; }}