Мы используем Spring Cloud Gateway (версия MVC) перед сервисом Rails (назовем его mailbox) и испытываем затруднения, когда значение параметра запроса включает символ + (плюс). Вот пример:
[email protected]+ в пробел.mailbox, он обратно кодирует значение, в результате чего получается email=bob%[email protected]mailbox декодирует его как email=bob [email protected], что приводит к сбоюАльтернативой было закодировать + в клиенте, но тогда мы имеем:
?email=bob%[email protected]%2B в +.mailbox, он обратно кодирует значение, но, поскольку + не считается специальным символом, оно остается как [email protected]mailbox декодирует его как email=bob [email protected], что приводит к сбоюЯ не могу найти способ указать шлюзу не декодировать исходный запрос или заставить его кодировать + перед отправкой запроса на mailbox. Есть ли способ сделать это? Есть ли другое решение? Я ничего не могу придумать. Как будто все предпринятые шаги в порядке (сначала декодирование, затем кодирование), но конечный результат неправильный. Мне нужно mailbox, чтобы получить электронное письмо с +, но я не могу.
Спасибо за вашу помощь!
Мы столкнулись с той же проблемой и смогли обойти ее, вручную закодировав + в пересылаемых запросах после запуска существующего кодировщика.
Это было достигнуто за счет использования индивидуального ClientHttpRequestFactory следующим образом:
@Configuration
class WebMvcConfiguration {
@Bean
fun clientHttpRequestFactory(): ClientHttpRequestFactory =
CustomClientHttpRequestFactory()
}
class CustomClientHttpRequestFactory : JdkClientHttpRequestFactory() {
override fun createRequest(uri: URI, httpMethod: HttpMethod): ClientHttpRequest {
val encodedURI = URI(customUriEncode(uri.toString()))
return super.createRequest(encodedURI, httpMethod)
}
private fun customUriEncode(str: String): String =
str.replace(oldValue = "+", newValue = "%2B")
}
Мы считаем, что это безопасно, поскольку и +, и %20 в исходном запросе декодируются в (пробел) до того, как он достигнет фабрики запросов, поэтому не будут перекодированы обратно в %2B.