在我目前的项目中,我们部署了几个Spring Boot 1.5.4。在
微服务。我们已经配置了一个Apache代理均衡器:Openshift
中使用库伯内特斯
释放
From To
/msa/microname1 -> /
/msa/microname2 -> /
...
最近我们引入了Spring Boot 2
,并使用静态编程语言
开发了一个新的微服务。我们以相同的方式配置了平衡器,考虑到像/Health
和/info
这样的网址被放置在/执行器
路径下。现在,当我们使用这个新微服务的任何endpoint(/Health
或我们的任何endpoint)时,我们都会遇到这样的错误:
org.springframework.security请求被拒绝,因为URL没有被规范化。
我们在微服务中拦截的路径在开头有一个额外的斜杠://
当我使用微服务url时,我可以毫无问题地获取资源,但是当使用代理平衡器映射时,我们遇到了上述问题。
我们检查了我们的代理均衡器,它的配置方式与其他均衡器相同。我们必须考虑Spring Boot 2
上的任何额外配置吗?这可能是与静态编程语言
相关的问题吗?
更新
作为一项调整,我们已将DefaultHttpFirewall配置为允许url连接斜杠,但这并不能解决双斜杠的问题。它只掩盖了问题。
@Bean
fun allowUrlEncodedSlash(): HttpFirewall {
var firewall: DefaultHttpFirewall = DefaultHttpFirewall()
firewall.setAllowUrlEncodedSlash(true)
return firewall
}
override fun configure(web: WebSecurity) {
web.httpFirewall(allowUrlEncodedSlash())
}
检查这个答案:https://stackoverflow.com/a/48644226/10451721
这似乎和你的问题一样,但Java而不是静态编程语言。
默认情况下,Spring不喜欢URL中的//
。
我已经为您转换了链接答案中的Java:
@Bean
fun allowUrlEncodedSlashHttpFirewall(): HttpFirewall {
val firewall = StrictHttpFirewall()
firewall.setAllowUrlEncodedSlash(true)
return firewall
}
通过在我们的平衡器中向应用程序添加上下文来解决。现在我们所有的endpoint在我们的微服务中都有一个上下文,在application. yml中定义。
From To
/msa/microname1 -> /
/msa/microname2 -> /
/msa/Kotlinname/kt -> /kt