Как избавиться от ПРЕДУПРЕЖДЕНИЯ: PWC4011: Невозможно установить кодировку символа запроса в UTF-8 - PullRequest
22 голосов
/ 04 октября 2011

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

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

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

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

Ответы [ 2 ]

41 голосов
/ 04 октября 2011

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, и все это не будет работать при развертывании веб-приложения на другом сервере. Канонический независимый от сервера подход заключается в создании фильтра сервлета , который в основном выполняет следующую работу в методе doFilter():

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

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


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

0 голосов
/ 31 января 2017

У меня ничего не получалось, вот так:

  1. Администрация Glassfish

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

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

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

Уровень записи : Сильный / Выкл.

Сильнее, если может появиться какая-либо ошибка

...