提问者:小点点

使用Spring Boot 2和静态编程语言“URL未规范化”


在我目前的项目中,我们部署了几个Spring Boot 1.5.4。在Openshift中使用库伯内特斯释放微服务。我们已经配置了一个Apache代理均衡器:

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())
}

共2个答案

匿名用户

检查这个答案: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