Springboot не пропускает процент и обратную косую черту в URL - PullRequest
0 голосов
/ 29 июня 2018

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

Когда отправляется знак процента в процентах, возвращается http 400. Это действительно, если два символа, следующие за%, составляют кодированный в UTF символ

Обратная косая черта преобразуется в прямую косую черту. Мне нужно, чтобы он оставался без косой черты.

Полагаю, это могут быть проблемы с конфигурацией Tomcat или сервлета.

(весенняя загрузка версии 1.5.14. RELEASE)

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Знаки процента (%) не должны вызывать проблем, если вы правильно их кодируете по URL (%25). Однако косая черта и обратная косая черта не будут работать с Tomcat, даже если вы закодируете их (%2F и %5C).

Вы можете установить следующие свойства при запуске приложения:

-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
-Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true

Однако это не решит проблему, потому что в этом случае эти закодированные косые черты будут распознаваться как реальные. Итак, допустим, у вас есть следующий контроллер:

@ResponseBody
@RequestMapping("/api/{foo}")
public String getFoo(@PathVariable String foo) {
    return foo;
}

Хорошо, тогда, если вы позвоните /api/test%5Ctest, он не сможет найти правильный путь. Решение этой проблемы состоит в том, чтобы использовать сопоставления с подстановочными знаками и анализировать сам URL-адрес из входящего HttpServletRequest:

@RequestMapping("/api/**")
public String getFoo(HttpServletRequest request) {
    // ...
}

Другое решение - использовать совершенно другой веб-контейнер. Например, при использовании Jetty это совсем не проблема, и косые черты и обратные косые черты в кодировке URL будут работать.

0 голосов
/ 29 июня 2018

То, что вы испытываете, не относится к Spring Boot. Вместо этого это ограничение HTTP.

Стандарт HTTP требует, чтобы любой URL, содержащий символы процента, был декодирован веб-сервером (см. Стр. 36):

Если Request-URI кодируется с использованием кодировки «% HEX HEX» [42], Исходный сервер ДОЛЖЕН декодировать Request-URI, чтобы правильно интерпретировать запрос.

В результате невозможно надежно избежать символа косой черты.

Поэтому, когда косая черта используется в URL - с кодировкой или без нее - она ​​будет рассматриваться как разделитель пути. Поэтому его нельзя использовать в переменной пути Spring Boot. Аналогичная проблема существует для знака процента и обратной косой черты.

Ваши лучшие варианты - использовать параметры запроса или запрос POST.

В следующем URL передается значение test_with_/and_%:

https://host/abc/def?text=test_with_%2F_and%25
0 голосов
/ 29 июня 2018
final String path =
                    request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE).toString();
            final String bestMatchingPattern =
                    request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE).toString();

            String arguments = new AntPathMatcher().extractPathWithinPattern(bestMatchingPattern, path);



            if (null != arguments && !arguments.isEmpty()) {
                pattern = pattern + '/' + arguments;
            }

Я также столкнулся с подобной проблемой, и я использовал это, так что надеюсь, что это может помочь

...