Недопустимые символы в начале тела JSON в Dropwizard Rest API

Я создал базовый CRUD API с помощью Dropwizard и Spring. В теле объекта ответа я получаю следующее:

 )]}',
 {
  "id":10,
  "initiator":2,
  "target":1,
  "statusId":1,
  "created":"2018-04-30T14:45:01.173"
 }

Я проверил API с помощью curl, postman и программно во время тестирования, будьте уверены, недопустимые символы )]}', присутствуют всегда. Почтальон, кажется, способен игнорировать их и отображать довольно распечатанный вывод, однако будьте уверены, и я предполагаю, что большинство парсеров JSON не могут правильно его проанализировать.

Вопросов:

  1. Кто они такие?
  2. Почему они присутствуют?
  3. Как мне их удалить?

Я много лет писал REST API и никогда не видел ничего подобного. Я впервые использую dropwizard, поэтому я оптимистично надеюсь, что это некоторая конфигурация, которую я пропустил.

Помимо недопустимых символов, функционально API работает нормально.

Это унаследованная кодовая база, и другие API также возвращают эти символы. В целях тестирования, будьте уверены, недопустимые символы отфильтровываются перед обработкой ответа. Хотя в краткосрочной перспективе это кажется мне приемлемым обходным путем, в долгосрочной перспективе всем будущим потребителям API придется выполнять обходной путь, и в идеале это должно быть исправлено в самом API.

Итак, сегодня я узнал о неразборчивом беспорядочном соглашении, которое предотвращает захват JSON. Я действительно должен был знать об этом! Моя кодовая база специально добавляла эту строку, и все потребители API удаляли ее перед обработкой.

Clarkey 01.05.2018 17:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
141
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Не знаю о DropWizard, но он предназначен для предотвращения взлома json. Весной есть класс MappingJackson2HttpMessageConverter.
который имеет ту же функцию, но другой префикс "{} &&"

/**
 * Indicate whether the JSON output by this view should be prefixed with "{} &&". Default is false.
 * <p>Prefixing the JSON string in this manner is used to help prevent JSON Hijacking.
 * The prefix renders the string syntactically invalid as a script so that it cannot be hijacked.
 * This prefix does not affect the evaluation of JSON, but if JSON validation is performed on the
 * string, the prefix would need to be ignored.
 */
public void setPrefixJson(boolean prefixJson) {
    this.prefixJson = prefixJson;
}

Вы можете относиться к этому.

Изменить 1: Spring версии 4.2.0.RELEASE и далее, префикс по умолчанию обновлен до )]} ',

Спасибо за это. Определенно указал мне в правильном направлении, чтобы понять, что происходит. Интересно, что в javadoc, с которым вы связались, говорится: «Укажите, должен ли вывод JSON этого представления иметь префикс«)]} ', ». По умолчанию - false». Так что, по крайней мере, в текущей версии документов префикс совпадает с тем, что было установлено моей кодовой базой! Интересно, почему Spring изменил его и является ли это новое значение стандартом. Удачи в поисках этого в Google (глаза).

Clarkey 02.05.2018 09:54

Плохо, я на самом деле скопировал javadoc из моей рабочей области eclipse, в которой была версия spring 3.1.4, но я предоставил ссылку javadoc из Spring версии 5.0.5.

Pratapi Hemant Patel 02.05.2018 11:56

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