XML Частичное реагирование разрывается с символом валюты на Wildfly / Primefaces - PullRequest
1 голос
/ 08 апреля 2020

Я испытываю ошибку XML в ответе на запрос, когда он содержит символ валюты (в данном случае, '£').

Я провел небольшое тестирование и сузил его к использованию '£' в XML, которое каким-то образом вызывает неполный закрывающий тег, что, конечно, приводит к непонятному XML, например:

<?xml version='1.0' encoding='UTF-8'?>
<partial-response>
<changes>
<update id="productForm">
<![CDATA[
<form enctype="application/x-www-form-urlencoded">
    <div>
         <span>
             <span id="productForm:price">£10.00</span>
         </span>
    </div>
</form>]]>
</update>
</changes>
</partial-response

Это связано со сломанным (не опечатка) partial-response закрывающий тег, как подтверждено в консоли разработчика: enter image description here

Причиной является £, что определяется при отладке и тестировании.

Вот некоторые утверждения, которые я могу сделать:

  • Уязвимый код прекрасно работает на Java 7 / Glassfi sh 3
  • Тот же код не работает на Java 8 / Wildfly 17 , если не пропущен знак £, в этот момент это BAU
  • Для символа валюты была предпринята попытка с:

    • <f:convertNumber type="currency" locale="en_GB" currencyCode="GBP"/>
    • <f:convertNumber type="currency" locale="en_GB" currencySymbol="&#163;"/> Все они терпят неудачу.
    • <f:convertNumber type="currency" locale="en_GB" pattern="0.00"/> нет, но очевидно, потому что это не заканчивается £
  • Удаление всех остальных шаблонов X HTML и простое добавление <p>&#163;</p> также делает его ненужным.

Я могу Я не вижу ничего очевидного, что могло бы вызвать это, и при этом я не могу определить, является ли это проблемой сервера приложений или конфигурации приложения. Он был протестирован в средах * NIX, и нет никаких оснований предполагать, что в этом отношении он является экологическим.

Есть ли что-то очевидное, чего мне здесь не хватает? Все кодировки, которые я вижу, установлены в UTF-8, поэтому я озадачен этим и не могу найти других подобных случаев с помощью поиска.

Спасибо за любые предложения заранее

1 Ответ

2 голосов
/ 08 апреля 2020

После дальнейшего исследования было установлено, что это (неопределенный) результат @WebFilter.

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

Проблемная область кода в веб-фильтре:

servletResponse.setContentLength( filteredContent.length() );

Я не писал рассматриваемый класс и подозреваем, что это мог быть «шаблонный код», но эта переустановка атрибута, по-видимому, вызывает гораздо больше проблем, чем решает. Удаление это решило проблему. Может показаться, что сервлет способен самостоятельно обрабатывать этот атрибут (по крайней мере, до дальнейшего тестирования).

...