在我当前的项目中,我们在Spring Boot 1.5.4.RELEASE
和Openshift
中部署了多个Kubernetes
微服务。我们已经配置了Apache Proxy Balancer:
From To
/msa/microname1 -> /
/msa/microname2 -> /
...
最近,我们引入了Spring Boot 2
,并使用Kotlin
开发了一种新的微服务。考虑到将/health
和/info
之类的网址放在/actuator
路径下,我们以相同的方式配置了均衡器。
现在,当我们使用此新微服务的任何终结点(/health
或我们的任何终结点)时,都会出现如下错误:
org.springframework.security.web.firewall.RequestRejectedException: 该请求被拒绝,因为URL未标准化...
我们在微服务中截取的路径开头有一个斜杠://<path_to_resource>
当我使用微服务url时,我获得的资源没有问题,但是当使用代理平衡器映射时,我们遇到了上述问题。
我们检查了代理平衡器,并且它的配置方式与其他平衡器相同。
我们必须考虑对Spring Boot 2
进行任何额外的配置吗?
这可能是与Kotlin
相关的问题吗?
更新
作为一项调整,我们将DefaultHttpFirewall配置为允许url包含斜杠,但这不能解决双斜杠的问题。它只会掩盖问题。
@Bean
fun allowUrlEncodedSlash(): HttpFirewall {
var firewall: DefaultHttpFirewall = DefaultHttpFirewall()
firewall.setAllowUrlEncodedSlash(true)
return firewall
}
override fun configure(web: WebSecurity) {
web.httpFirewall(allowUrlEncodedSlash())
}
答案 0 :(得分:0)
检查以下答案:https://stackoverflow.com/a/48644226/10451721
这似乎与您的问题相同,但是使用Java而不是Kotlin。
默认情况下,Spring不喜欢URL中的//
。
我已经为您转换了链接答案中的Java:
@Bean
fun allowUrlEncodedSlashHttpFirewall(): HttpFirewall {
val firewall = StrictHttpFirewall()
firewall.setAllowUrlEncodedSlash(true)
return firewall
}
答案 1 :(得分:0)
通过在我们的均衡器中向应用程序添加上下文来解决。 现在,我们所有的端点在我们的微服务中都有一个上下文,该上下文在application.yml中定义。
From To
/msa/microname1 -> /
/msa/microname2 -> /
/msa/Kotlinname/kt -> /kt