文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

springcloud gateway集成knife4j的方法是什么

2023-07-05 12:04

关注

这篇文章主要介绍“springcloud gateway集成knife4j的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“springcloud gateway集成knife4j的方法是什么”文章能帮助大家解决问题。

springcloud-gateway集成knife4j

环境信息

环境信息

准备工作

各微服务&网关引入依赖

<dependency>    <groupId>com.github.xiaoymin</groupId>    <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>    <version>4.0.0</version></dependency>

微服务集成knife4j 第一步:编写Knife4jApiInfoProperties

import com.ideaaedi.springcloud.jd.commonspring.config.Knife4jConfig;import lombok.Data;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;@Data@Componentpublic class Knife4jApiInfoProperties {            @Value("${api-info.base-package:com}")    private String basePackage;            @Value("${api-info.enable-security:true}")    private boolean enableSecurity;            @Value("${api-info.title:}")    private String title;            @Value("${api-info.description:api info}")    private String description;            @Value("${api-info.version:1.0.0}")    private String version;            @Value("${api-info.contact-name:JustryDeng}")    private String contactName;            @Value("${api-info.contact-url:https://gitee.com/JustryDeng/projects}")    private String contactUrl;            @Value("${api-info.contact-email:13548417409@163.com}")    private String contactEmail;}

编写配置类Knife4jConfig

import com.ideaaedi.springcloud.jd.commonds.constant.BaseConstant;import com.ideaaedi.springcloud.jd.commonspring.config.properties.Knife4jApiInfoProperties;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import springfox.documentation.builders.ApiInfoBuilder;import springfox.documentation.builders.PathSelectors;import springfox.documentation.builders.RequestHandlerSelectors;import springfox.documentation.service.ApiInfo;import springfox.documentation.service.ApiKey;import springfox.documentation.service.AuthorizationScope;import springfox.documentation.service.Contact;import springfox.documentation.service.SecurityReference;import springfox.documentation.service.SecurityScheme;import springfox.documentation.spi.DocumentationType;import springfox.documentation.spi.service.contexts.SecurityContext;import springfox.documentation.spring.web.plugins.Docket;import java.util.ArrayList;import java.util.List;@Slf4j@Configurationpublic class Knife4jConfig implements WebMvcConfigurer {            public static String[] RESOURCE_URLS = new String[]{"/webjars.*"));        return result;    }        private SecurityContext getContextByPath(String pathRegex) {        return SecurityContext.builder()                .securityReferences(defaultAuth())                .forPaths(PathSelectors.regex(pathRegex))                .build();    }        private List<SecurityReference> defaultAuth() {        List<SecurityReference> result = new ArrayList<>();        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];        authorizationScopes[0] = authorizationScope;        result.add(new SecurityReference("Authorization", authorizationScopes));        return result;    }    }

放行相关静态资源

对于管控了权限的应用,应放行以下资源

# 需要放行的资源已经定义进上面编写的Knife4jConfig中public static String[] RESOURCE_URLS = new String[]{"/webjars@RestControllerpublic class Knife4jGatewayConfig {        private final SecurityConfiguration securityConfiguration;        private final UiConfiguration uiConfiguration;        private final SwaggerResourceAdapter swaggerResourceAdapter;        public Knife4jGatewayConfig(@Autowired(required = false) SecurityConfiguration securityConfiguration,                                @Autowired(required = false) UiConfiguration uiConfiguration,                                SwaggerResourceAdapter swaggerResourceAdapter) {        this.securityConfiguration = securityConfiguration;        this.uiConfiguration = uiConfiguration;        this.swaggerResourceAdapter = swaggerResourceAdapter;    }            @GetMapping("/swagger-resources/configuration/security")    public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() {        return Mono.just(new ResponseEntity<>(                Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK));    }            @GetMapping("/swagger-resources/configuration/ui")    public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {        return Mono.just(new ResponseEntity<>(                Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));    }            @GetMapping("/swagger-resources")    public Mono<ResponseEntity<List<SwaggerResource>>> swaggerResources() {        return Mono.just(new ResponseEntity<>(swaggerResourceAdapter.get(), HttpStatus.OK));    }            @GetMapping("/favicon.ico")    public Mono<ResponseEntity<?>> favicon() {        return Mono.just(new ResponseEntity<>(null, HttpStatus.OK));    }            @Slf4j    @Component    public static class SwaggerResourceAdapter implements SwaggerResourcesProvider {                        @Value("${spring.cloud.gateway.discovery.locator.enabled:false}")        private boolean autoCreateRouter;                @Value("${spring.application.name:}")        private String applicationName;                @Resource        private RouteLocator routeLocator;                @Resource        private GatewayProperties gatewayProperties;                        @Override        public List<SwaggerResource> get() {            List<SwaggerResource> finalResources;            Set<String> routes = new LinkedHashSet<>(16);            // 获取所有路由的id            routeLocator.getRoutes().subscribe(route -> {                String routeId = route.getId();                routeId = routeId.replace("ReactiveCompositeDiscoveryClient_", "");                routes.add(routeId);            });            // 没有开启自动创建路由,那么走配置文件中配置的路由            if (!autoCreateRouter) {                finalResources = new ArrayList<>(16);                gatewayProperties.getRoutes().stream()                        // 过滤出配置文件中定义的路由                        .filter(routeDefinition -> routes.contains(routeDefinition.getId())).forEach(route -> {                            route.getPredicates().stream()                                    // 过滤出设置有Path Predicate的路由                                    .filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName()))                                    // 根据路径拼接成api-docs路径,生成SwaggerResource                                    .forEach(predicateDefinition -> finalResources.add(swaggerResource(route.getId(),                                            predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0")                                                    .replace("**", "v2/api-docs"))));                        });            } else {                finalResources = routes.stream().map(routeId -> swaggerResource(routeId, routeId + "/v2/api-docs")).collect(Collectors.toList());            }            List<SwaggerResource> resources = new ArrayList<>(finalResources);            // resources过滤掉网关的SwaggerResource, 我们一般也不会在网关中编写业务controller            if (StringUtils.isNotBlank(applicationName)) {                resources = resources.stream().filter(x -> !applicationName.equalsIgnoreCase(x.getName())).collect(Collectors.toList());            }            // 排序            resources.sort(Comparator.comparing(x -> x.getName().length()));            return resources;        }                        private SwaggerResource swaggerResource(String name, String location) {            log.info("name:{},location:{}", name, location);            SwaggerResource swaggerResource = new SwaggerResource();            swaggerResource.setName(name);            swaggerResource.setLocation(location);            swaggerResource.setSwaggerVersion("2.0");            return swaggerResource;        }            }}

测试验证

启动微服务后,访问{网关}/doc.html完成验证

springcloud gateway集成knife4j的方法是什么

关于“springcloud gateway集成knife4j的方法是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯