Подтвердить что ты не робот

Как избавиться от WARNING: PWC4011: Невозможно установить кодировку символов запроса в UTF-8

Это на GlassFish 3.1, используя PrimeFaces поверх Mojarra и соленого с MyFaces CODI. Примерно по каждому запросу появляется следующее сообщение:

ПРЕДУПРЕЖДЕНИЕ: PWC4011: невозможно установить кодировку символов запроса в UTF-8 из контекста /com.myapp_war_0.1, поскольку параметры запроса уже прочитаны, или ServletRequest.getReader() уже был вызван

Это произошло с тех пор, как я начал проект - до сих пор я игнорировал его, но теперь я понял, что трачу много времени на чтение. Здесь я нашел интересную, но неполную рабочую область , но я этого не понимаю.

Может кто-нибудь предложить, как отключить это сообщение, не подавляя другие возможные предупреждающие сообщения?

4b9b3361

Ответ 1

JSF/Facelets использует по умолчанию UTF-8 для декодирования параметров HTTP-запроса. GlassFish сам по умолчанию использует ISO-8859-1 для декодирования параметров HTTP-запроса. Параметры HTTP-запроса могут анализироваться и декодироваться только один раз, и это происходит всякий раз, когда код запроса запрашивается кодом в первый раз, например request.getParameter("name"). Таким образом, если сначала запрашивается параметр запроса, прежде чем JSF установит кодировку параметра запроса в UTF-8, тогда она будет (неправильно) проанализирована с использованием ISO-8859-1.

Когда JSF необходимо установить кодировку параметра запроса во время фазы просмотра, как показано ниже,

request.setCharacterEncoding("UTF-8");

в то время как параметры запроса уже разобраны, GlassFish точно покажет это предупреждение.

Нежелательным последствием является то, что все эти параметры HTTP-запроса могут оказаться в Mojibake. Данные формы первоначально отправляются и кодируются с использованием UTF-8. Если вы декодируете данные UTF-8 с использованием другой кодировки, такой как ISO-8859-1, то символы в 8-битном диапазоне и выше (обычно это те "специальные символы", как é, à, ö и т.д. будут повреждены и закончиться в é, à, ö и т.д.

Технически правильным решением является не запрашивать параметр HTTP-запроса до того, как JSF установит правильную кодировку. Вам в основном нужно проверить весь код, который выполняется до фазы просмотра JSF, например, фильтры сервлетов, фазовые прослушиватели и т.д., Если они этого не делают.

Если вы не можете найти его или код находится вне вашего контроля, вы можете сказать GlassFish использовать UTF-8 вместо этого, чтобы декодировать параметры HTTP-запроса, так что его не нужно менять, когда JSF хочу их получить. Вы можете сделать это, добавив следующую запись в <glassfish-web-app> вашего файла /WEB-INF/glassfish-web.xml:

<parameter-encoding default-charset="UTF-8"/>

(обратите внимание: файл и корневая запись ранее называются sun-web.xml и <sun-web-app> соответственно)

Отмечено, что это специфично для GlassFish, и все это не сработает при развертывании webapp на другой сервер. Канонический независимый от сервера подход заключается в создании сервлет-фильтра, который выполняет в основном следующее задание в методе doFilter():

request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);

и убедитесь, что он был сопоставлен перед любым другим фильтром, который должен собирать любые параметры HTTP-запроса.


Обновить: почему GlassFish установил его заранее, возможно, это вызвано PrimeFaces. См. Также этот связанный вопрос: Unicode-вход, полученный через входные компоненты PrimeFaces, поврежден.

Ответ 2

Ничего не работало для меня именно так:

  • admin >

  • Конфигурации → server-config → Настройки регистратора- > Уровни журнала

  • Добавить регистратор:

Имя регистратора: org.apache.catalina.connector.Request

Уровень журнала: серьезный/выкл

Тяжелее лучше, если появится какая-либо ошибка.