«URL не был нормализован» в Spring Boot 2 и Kotlin - PullRequest
0 голосов
/ 03 октября 2018

В моем текущем проекте мы развернули несколько Spring Boot 1.5.4.RELEASE микросервисов в Openshift с Kubernetes.Мы настроили Apache Proxy Balancer:

From                            To
/msa/microname1          ->     /
/msa/microname2          ->     /
...

Недавно мы представили Spring Boot 2 и разработали новый микросервис с Kotlin.Мы настроили балансировщик таким же образом, учитывая, что URL-адреса, такие как /health и /info, размещены в пути /actuator.Теперь, когда мы используем любую конечную точку этого нового микросервиса (/health или любую из наших конечных точек), у нас возникает ошибка, подобная этой:

org.springframework.security.web.firewall.RequestRejectedException:запрос был отклонен, поскольку URL не был нормализован ...

Путь, который мы перехватываем в нашем микросервисе, в начале имеет дополнительную косую черту: //<path_to_resource>

Когда я используюurl microservice Я получаю ресурс без проблем, но при использовании сопоставления прокси-балансировщика у нас возникает проблема, описанная выше.

Мы проверили наш прокси-балансировщик, и он настроен так же, как и другие.Есть ли какая-либо дополнительная конфигурация на 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 голосов
/ 27 ноября 2018

Решается добавлением контекста к приложению в нашем балансировщике.Теперь все наши конечные точки имеют контекст в нашем микросервисе, определенный в application.yml.

From                            To
/msa/microname1          ->     /
/msa/microname2          ->     /
/msa/Kotlinname/kt       ->     /kt
0 голосов
/ 04 октября 2018

Проверьте этот ответ: https://stackoverflow.com/a/48644226/10451721

Кажется, это та же проблема, что и у вас, но в Java вместо Kotlin.

По умолчанию Spring не любит // в URL-адресах.

Я преобразовал Java в связанном ответе для вас:

@Bean
fun allowUrlEncodedSlashHttpFirewall(): HttpFirewall {
    val firewall = StrictHttpFirewall()
    firewall.setAllowUrlEncodedSlash(true)
    return firewall
}
...