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, поврежден .