傅行帆 6 年之前
父節點
當前提交
f22a2568fe

+ 48
- 0
CODE/smart-community/gateway/src/main/java/com/community/huiju/config/SwaggerProvider.java 查看文件

@@ -0,0 +1,48 @@
1
+package com.community.huiju.config;
2
+
3
+import lombok.AllArgsConstructor;
4
+import org.springframework.cloud.gateway.config.GatewayProperties;
5
+import org.springframework.cloud.gateway.route.RouteLocator;
6
+import org.springframework.cloud.gateway.support.NameUtils;
7
+import org.springframework.context.annotation.Primary;
8
+import org.springframework.stereotype.Component;
9
+import springfox.documentation.swagger.web.SwaggerResource;
10
+import springfox.documentation.swagger.web.SwaggerResourcesProvider;
11
+
12
+import java.util.ArrayList;
13
+import java.util.List;
14
+
15
+/**
16
+ * @author Sywd
17
+ */
18
+@Component
19
+@Primary
20
+@AllArgsConstructor
21
+public class SwaggerProvider implements SwaggerResourcesProvider {
22
+    public static final String API_URI = "/v2/api-docs";
23
+    private final RouteLocator routeLocator;
24
+    private final GatewayProperties gatewayProperties;
25
+
26
+
27
+    @Override
28
+    public List<SwaggerResource> get() {
29
+        List<SwaggerResource> resources = new ArrayList<>();
30
+        List<String> routes = new ArrayList<>();
31
+        routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
32
+        gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId()))
33
+                .forEach(routeDefinition -> routeDefinition.getPredicates().stream()
34
+                        .filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName()))
35
+                        .forEach(predicateDefinition -> resources.add(swaggerResource(routeDefinition.getId(),
36
+                                predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0")
37
+                                        .replace("/**", API_URI)))));
38
+        return resources;
39
+    }
40
+
41
+    private SwaggerResource swaggerResource(String name, String location) {
42
+        SwaggerResource swaggerResource = new SwaggerResource();
43
+        swaggerResource.setName(name);
44
+        swaggerResource.setLocation(location);
45
+        swaggerResource.setSwaggerVersion("2.0");
46
+        return swaggerResource;
47
+    }
48
+}

+ 33
- 0
CODE/smart-community/gateway/src/main/java/com/community/huiju/filter/SwaggerHeaderFilter.java 查看文件

@@ -0,0 +1,33 @@
1
+package com.community.huiju.filter;
2
+
3
+
4
+import com.community.huiju.config.SwaggerProvider;
5
+import org.springframework.cloud.gateway.filter.GatewayFilter;
6
+import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
7
+import org.springframework.http.server.reactive.ServerHttpRequest;
8
+import org.springframework.stereotype.Component;
9
+import org.springframework.util.StringUtils;
10
+import org.springframework.web.server.ServerWebExchange;
11
+
12
+@Component
13
+public class SwaggerHeaderFilter extends AbstractGatewayFilterFactory {
14
+    private static final String HEADER_NAME = "X-Forwarded-Prefix";
15
+
16
+    @Override
17
+    public GatewayFilter apply(Object config) {
18
+        return (exchange, chain) -> {
19
+            ServerHttpRequest request = exchange.getRequest();
20
+            String path = request.getURI().getPath();
21
+            if (!StringUtils.endsWithIgnoreCase(path, SwaggerProvider.API_URI)) {
22
+                return chain.filter(exchange);
23
+            }
24
+
25
+            String basePath = path.substring(0, path.lastIndexOf(SwaggerProvider.API_URI));
26
+
27
+
28
+            ServerHttpRequest newRequest = request.mutate().header(HEADER_NAME, basePath).build();
29
+            ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();
30
+            return chain.filter(newExchange);
31
+        };
32
+    }
33
+}

+ 49
- 0
CODE/smart-community/gateway/src/main/java/com/community/huiju/handle/SwaggerHandler.java 查看文件

@@ -0,0 +1,49 @@
1
+package com.community.huiju.handle;
2
+
3
+import org.springframework.beans.factory.annotation.Autowired;
4
+import org.springframework.http.HttpStatus;
5
+import org.springframework.http.ResponseEntity;
6
+import org.springframework.web.bind.annotation.GetMapping;
7
+import org.springframework.web.bind.annotation.RequestMapping;
8
+import org.springframework.web.bind.annotation.RestController;
9
+import reactor.core.publisher.Mono;
10
+import springfox.documentation.swagger.web.SecurityConfiguration;
11
+import springfox.documentation.swagger.web.SecurityConfigurationBuilder;
12
+import springfox.documentation.swagger.web.SwaggerResourcesProvider;
13
+import springfox.documentation.swagger.web.UiConfiguration;
14
+import springfox.documentation.swagger.web.UiConfigurationBuilder;
15
+
16
+import java.util.Optional;
17
+
18
+@RestController
19
+@RequestMapping("/swagger-resources")
20
+public class SwaggerHandler {
21
+    @Autowired(required = false)
22
+    private SecurityConfiguration securityConfiguration;
23
+    @Autowired(required = false)
24
+    private UiConfiguration uiConfiguration;
25
+    private final SwaggerResourcesProvider swaggerResources;
26
+
27
+    @Autowired
28
+    public SwaggerHandler(SwaggerResourcesProvider swaggerResources) {
29
+        this.swaggerResources = swaggerResources;
30
+    }
31
+
32
+
33
+    @GetMapping("/configuration/security")
34
+    public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() {
35
+        return Mono.just(new ResponseEntity<>(
36
+                Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK));
37
+    }
38
+
39
+    @GetMapping("/configuration/ui")
40
+    public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {
41
+        return Mono.just(new ResponseEntity<>(
42
+                Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));
43
+    }
44
+
45
+    @GetMapping("")
46
+    public Mono<ResponseEntity> swaggerResources() {
47
+        return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
48
+    }
49
+}