java - Spring Cloud Gateway - 如果存在则去除前缀
问题描述
我需要 Spring Cloud Gateway 根据Host
标头或路径前缀将请求路由到微服务。在任何情况下,路径前缀都必须从路径中删除,但前提是它已设置。
我想出了以下代码,我认为只有“sip”是前缀:
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.host("sip")
.or()
.path("/sip/**")
.filters(f -> f.stripPrefix(1))
.uri("http://sip:8080")
)
.build();
}
问题是 Spring 会删除路径的第一段,即使它不是前缀。
例如,带有路径的请求/sip/calls
成功,但/calls
设置了 Host 标头的请求不成功,因为 Spring 会考虑/calls
前缀并将其删除,从而导致路径为空。/calls/calls
带有Host
标头的路径成功,因为 Spring 仅删除了第一个calls
路径段。
如何将主机和路径一起使用,仅当前缀与定义的值匹配时才删除它?
ps我在考虑每个服务有两条路线,但看起来不太好,尽管它实现了目标:
.route(r -> r.header("Host", "form").uri("http://form:8080"))
.route(r -> r.path("/form/**")
.filters(f -> f.stripPrefix(1))
.uri("http://form:8080"))
解决方案
你可以这样做
.route(r -> r.host("sip")
.or()
.path("/sip/**")
.filters(f -> f.rewritePath("^/sip", ""))
.uri("http://sip:8080")
推荐阅读
- c# - 写入 SQLite 文件的奇怪字符 - 尝试在 SQLlite 数据库中存储字节数组
- swift - Swift - Secp256k1 计算公共秘密
- xml - 从第一个片段问题打开第二个片段
- c# - Navigate().GotoUrl() 期间 Selenium WebDriver 中的一般超时异常
- spring-boot - Hystrix Circuit Breaker Implementation be at Zuul API Gateway Level or at REST API Service Level
- c - C: error in calling struct function in main
- javascript - javascript更改选择选项背景颜色下拉
- python - Python 3.7 中的断点()
- java - No console output using log4j2 and slf4j
- python - How to represent the coefficients of a multi layer perception neural network?