Весенние облачные ворота. использование + (плюс) в значении параметра запроса

Мы используем Spring Cloud Gateway (версия MVC) перед сервисом Rails (назовем его mailbox) и испытываем затруднения, когда значение параметра запроса включает символ + (плюс). Вот пример:

  1. Клиент отправляет запрос на шлюз с [email protected]
  2. Шлюз декодирует значение параметра, превращая + в пробел.
  3. Прежде чем отправить запрос на mailbox, он обратно кодирует значение, в результате чего получается email=bob%[email protected]
  4. При получении этого параметра mailbox декодирует его как email=bob [email protected], что приводит к сбою

Альтернативой было закодировать + в клиенте, но тогда мы имеем:

  1. Клиент отправляет запрос на шлюз с ?email=bob%[email protected]
  2. Шлюз декодирует значение параметра, превращая %2B в +.
  3. Прежде чем отправить запрос на mailbox, он обратно кодирует значение, но, поскольку + не считается специальным символом, оно остается как [email protected]
  4. При получении этого параметра mailbox декодирует его как email=bob [email protected], что приводит к сбою

Я не могу найти способ указать шлюзу не декодировать исходный запрос или заставить его кодировать + перед отправкой запроса на mailbox. Есть ли способ сделать это? Есть ли другое решение? Я ничего не могу придумать. Как будто все предпринятые шаги в порядке (сначала декодирование, затем кодирование), но конечный результат неправильный. Мне нужно mailbox, чтобы получить электронное письмо с +, но я не могу.

Спасибо за вашу помощь!

1
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мы столкнулись с той же проблемой и смогли обойти ее, вручную закодировав + в пересылаемых запросах после запуска существующего кодировщика.

Это было достигнуто за счет использования индивидуального 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.

Другие вопросы по теме