Как обрабатывать фигурные скобки в RequestParam при весенней загрузке - PullRequest
0 голосов
/ 02 января 2019

У меня есть приложение весенней загрузки с сервисом GET.

@RequestMapping(value = "/abc/track/{type}", method = RequestMethod.GET)

    public void DummFunc(                            
          @RequestParam(value="subs", required = false) String sub,
,  HttpServletResponse response) {}

значение для subs является закодированным значением.

Если я передам следующее в качестве значения параметра subs

{%22endpoint%22:%22https://def.abc.com/tyu/send/eD3vpGNQW28:APA91bHOo8rYrV0xccdQz3okjZJG-QGrJX8LG6ahJnEUpMNfGedqi3hJxQsJx_8BMbH6oDjaSPPEXqzNWchWrGSkhuTkSdemikkys1U22Ipd7MsRw0owWbw89V2fslIVAJ6G5lkyvYuQ%22,%22expirationTime%22:null,%22keys%22:{%22p256dh%22:%22BK0pktn50CMsTQtqwdPlKlJtdFs0LFeXX14T1zgoz6QWnvSTp5dxtChnUP5P1JX0TsjcopbdPKyN31HfABMUyic%22,%22auth%22:%22qbO_z0vGao9wD-E5g8VU-A%22}}

Не удается захватить запрос, и управление не входит в функцию.

Если вместо этого мы передадим значение в параметрах sub:

%7B%22endpoint%22:%22https://def.abc.com/tyu/send/dX5q5eV7hFQ:APA91bHib-0QXrMzjatcvTR_uaIeeJK8lf6GmXUC9Jxv0Oxth-BzD4GmWnd4-YpDZv8qSFZ0eSg9mB2YkRvkc5ezdXW5KeaHjuQZfdyDxyBXjJgE-25Xbtlk37pdm8vfLk20k0k_VxW9%22,%22expirationTime%22:null,%22keys%22:%7B%22p256dh%22:%22BCCvcBLpRqp4u0auP688_MUJLsAiwWlQSn5kpyl8YVsEo_J-KpSdnhCmVIE_BhDXBcFYflPK52hqhYf3EaOCyuY%22,%22auth%22:%22iKuW_ESkCZnubWcQu_JK8w%22%7D%7D

Работает нормально.

  1. Почему это происходит? Что не так с первой кодировкой?

  2. Поскольку сервер не может обработать запрос, он возвращает 400. Мне нужно перехватить такие запросы, а затем обработать их, правильно их кодировав. Каким может быть путь вперед?

Я новичок в Spring boot / Spring и самой Java. Было бы здорово, если бы я мог получить некоторое представление.

Кроме того, я могу без проблем декодировать их оба онлайн - https://www.urldecoder.org/

Редактировать: В основном, запрос, по которому получен запрос, имеет { и } вместо %7B и %7D.

Мой вопрос - вместо сбоя приложения с 400 ошибочными запросами, как мне записать такие запросы в моем приложении, правильно их кодировать и затем обработать.

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Это не относится ни к Java, ни к самому Spring, но к справке по кодированию URL-адреса HTML. URL-адреса могут отправляться только через Интернет с использованием набора символов ASCII.

Небезопасные символы определены в начале RFC-1738 и вот список:

"<> #% {} | \ ^ ~ []` включая пустое / пустое пространство.

Кроме них, есть также зарезервированные символы , которые принадлежат следующим и используются для различения параметров, представления значения ключа, порта и т. Д.

; /? : @ = &

Используемые вами небезопасные символы { и }, равные %7B и %7D.


По сути, вы должны не беспокоиться о данных, которые клиент отправляет вам так, как вы описываете. Сервер должен требовать правильную форму и URL-адрес. Хотя браузеры и REST-клиенты автоматически кодируют эти символы, их программная отправка может привести к ошибкам. Единственное доступное решение Spring, о котором я знаю, - это регистрация компонента CharacterEncodingFilter (уже ответил ) или конфигурация Spring-Boot:

spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true

Сначала необходимо активировать кодировку и включить HTTP-запросы и ответы.

0 голосов
/ 02 января 2019

spring-boot очень заботится о безопасности. Я полагаю, что добавление двойных / одинарных кавычек или экранирование не сработает.

Пожалуйста, пройдите: https://tools.ietf.org/html/rfc1738

Я думаю, вы должны попробовать ручное кодирование { до %7B и } до %7D

Опасное:

Символы могут быть небезопасными по ряду причин. Пространство
символ небезопасен, потому что значительные пробелы могут исчезнуть и
незначительные пробелы могут быть введены при расшифровке URL или
набирается или подвергается обработке программ обработки текста.
Символы «<» и «>» небезопасны, поскольку они используются как
разделители вокруг URL в свободном тексте; знак кавычки ("" ") используется для
Разделяйте URL-адреса в некоторых системах. Символ "#" небезопасен и должен всегда кодируется, потому что он используется в World Wide Web и в других
системы для отделения URL-адреса от идентификатора фрагмента / якоря, который может следуй за этим. Символ "%" небезопасен, поскольку он используется для
кодировки других символов. Другие символы небезопасны, потому что
шлюзы и другие транспортные агенты иногда изменяют
такие персонажи. Это символы "{", "}", "|", "\", "^", "~",
"[", "]" и "` ".

Все небезопасные символы всегда должны быть закодированы в URL. Для
Например, символ "#" должен быть закодирован в URL даже в
системы, которые обычно не имеют дело с фрагментом или якорем
идентификаторы, так что если URL-адрес копируется в другую систему,
действительно использует их, нет необходимости изменять кодировку URL.

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