Spring Boot 2和Kotlin的“ URL未标准化”

时间:2018-10-03 09:17:14

标签: apache spring-boot kotlin openshift spring-boot-actuator

在我当前的项目中,我们在Spring Boot 1.5.4.RELEASEOpenshift中部署了多个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())
}

2 个答案:

答案 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