-
Notifications
You must be signed in to change notification settings - Fork 328
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
143 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
4 changes: 4 additions & 0 deletions
4
spring-cloud/gateway/src/main/java/com/git/hui/cloud/gateway/package-info.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
/** | ||
* Created by @author yihui in 20:04 20/6/2. | ||
*/ | ||
package com.git.hui.cloud.gateway; |
46 changes: 46 additions & 0 deletions
46
spring-cloud/gateway/src/main/java/com/git/hui/cloud/gateway/swagger/SwaggerHandler.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
package com.git.hui.cloud.gateway.swagger; | ||
|
||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.http.HttpStatus; | ||
import org.springframework.http.ResponseEntity; | ||
import org.springframework.web.bind.annotation.GetMapping; | ||
import org.springframework.web.bind.annotation.RequestMapping; | ||
import org.springframework.web.bind.annotation.RestController; | ||
import reactor.core.publisher.Mono; | ||
import springfox.documentation.swagger.web.*; | ||
|
||
import java.util.Optional; | ||
|
||
@RestController | ||
@RequestMapping("/swagger-resources") | ||
public class SwaggerHandler { | ||
@Autowired(required = false) | ||
private SecurityConfiguration securityConfiguration; | ||
@Autowired(required = false) | ||
private UiConfiguration uiConfiguration; | ||
private final SwaggerResourcesProvider swaggerResources; | ||
|
||
@Autowired | ||
public SwaggerHandler(SwaggerResourcesProvider swaggerResources) { | ||
this.swaggerResources = swaggerResources; | ||
} | ||
|
||
|
||
@GetMapping("/configuration/security") | ||
public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() { | ||
return Mono.just(new ResponseEntity<>( | ||
Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), | ||
HttpStatus.OK)); | ||
} | ||
|
||
@GetMapping("/configuration/ui") | ||
public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() { | ||
return Mono.just(new ResponseEntity<>( | ||
Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK)); | ||
} | ||
|
||
@GetMapping | ||
public Mono<ResponseEntity> swaggerResources() { | ||
return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK))); | ||
} | ||
} |
32 changes: 32 additions & 0 deletions
32
...gateway/src/main/java/com/git/hui/cloud/gateway/swagger/provider/SwaggerHeaderFilter.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
package com.git.hui.cloud.gateway.swagger.provider; | ||
|
||
import org.springframework.cloud.gateway.filter.GatewayFilter; | ||
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; | ||
import org.springframework.http.server.reactive.ServerHttpRequest; | ||
import org.springframework.stereotype.Component; | ||
import org.springframework.util.StringUtils; | ||
import org.springframework.web.server.ServerWebExchange; | ||
|
||
/** | ||
* Created by @author yihui in 20:10 20/6/2. | ||
*/ | ||
@Component | ||
public class SwaggerHeaderFilter extends AbstractGatewayFilterFactory { | ||
|
||
private static final String HEADER_NAME = "X-Forwarded-Prefix"; | ||
|
||
@Override | ||
public GatewayFilter apply(Object config) { | ||
return (exchange, chain) -> { | ||
ServerHttpRequest request = exchange.getRequest(); | ||
String path = request.getURI().getPath(); | ||
if (!StringUtils.endsWithIgnoreCase(path, SwaggerProvider.API_URI)) { | ||
return chain.filter(exchange); | ||
} | ||
String basePath = path.substring(0, path.lastIndexOf(SwaggerProvider.API_URI)); | ||
ServerHttpRequest newRequest = request.mutate().header(HEADER_NAME, basePath).build(); | ||
ServerWebExchange newExchange = exchange.mutate().request(newRequest).build(); | ||
return chain.filter(newExchange); | ||
}; | ||
} | ||
} |
50 changes: 50 additions & 0 deletions
50
...oud/gateway/src/main/java/com/git/hui/cloud/gateway/swagger/provider/SwaggerProvider.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
package com.git.hui.cloud.gateway.swagger.provider; | ||
|
||
import lombok.AllArgsConstructor; | ||
import org.springframework.cloud.gateway.config.GatewayProperties; | ||
import org.springframework.cloud.gateway.route.RouteLocator; | ||
import org.springframework.cloud.gateway.support.NameUtils; | ||
import org.springframework.context.annotation.Primary; | ||
import org.springframework.stereotype.Component; | ||
import springfox.documentation.swagger.web.SwaggerResource; | ||
import springfox.documentation.swagger.web.SwaggerResourcesProvider; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
|
||
/** | ||
* Created by @author yihui in 20:09 20/6/2. | ||
*/ | ||
@Component | ||
@Primary | ||
@AllArgsConstructor | ||
public class SwaggerProvider implements SwaggerResourcesProvider { | ||
public static final String API_URI = "/v2/api-docs"; | ||
private final RouteLocator routeLocator; | ||
private final GatewayProperties gatewayProperties; | ||
|
||
|
||
@Override | ||
public List<SwaggerResource> get() { | ||
List<SwaggerResource> resources = new ArrayList<>(); | ||
List<String> routes = new ArrayList<>(); | ||
//取出gateway的route | ||
routeLocator.getRoutes().subscribe(route -> routes.add(route.getId())); | ||
//结合配置的route-路径(Path),和route过滤,只获取有效的route节点 | ||
gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId())) | ||
.forEach(routeDefinition -> routeDefinition.getPredicates().stream() | ||
.filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName())) | ||
.forEach(predicateDefinition -> resources.add(swaggerResource(routeDefinition.getId(), | ||
predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0") | ||
.replace("/**", API_URI))))); | ||
return resources; | ||
} | ||
|
||
private SwaggerResource swaggerResource(String name, String location) { | ||
SwaggerResource swaggerResource = new SwaggerResource(); | ||
swaggerResource.setName(name); | ||
swaggerResource.setLocation(location); | ||
swaggerResource.setSwaggerVersion("2.0"); | ||
return swaggerResource; | ||
} | ||
} |