JSF 2.0 request.getParameter возвращает строку с неправильной кодировкой - PullRequest
3 голосов
/ 09 октября 2010

Я пишу приложение на JSF 2.0, которое поддерживает множество языков, в том числе со специальными символами. Я использую String value = request.getParameter ("name") и метод POST, кодировка страницы установлена ​​в UTF-8, а приложение развернуто на Apache Tomcat 6, в котором соединитель правильно установлен в utf-8 в server.xml файл:

 <Connector URIEncoding="utf-8" connectionTimeout="20000" port="8088" protocol="HTTP/1.1" redirectPort="8443"/>

Да, я получаю странные результаты, такие как, например, вместо ожидаемых специальных символов. Что я должен проверить дальше, чтобы избавиться от проблемы? Спасибо за помощь и предложения.

-------------- Edit -------------------

Это заголовок ответа:

Server  Apache-Coyote/1.1
Content-Type    text/html;charset=UTF-8
Content-Length  5160
Date    Sun, 10 Oct 2010 15:32:24 GMT

И заголовок запроса:

Host    localhost:8088
User-Agent  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 ( .NET CLR 3.5.30729; .NET4.0E)
Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language pl,en-us;q=0.7,en;q=0.3
Accept-Encoding gzip,deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive  115
Connection  keep-alive
Referer http://localhost:8088/Panel/addbuilding.jsp
Cookie  JSESSIONID=DD85C95BDFEA9E51B5E4146F2643295D
Pragma  no-cache
Cache-Control   no-cache

С наилучшими пожеланиями, дерзость.

Ответы [ 3 ]

3 голосов
/ 10 октября 2010

URIEncoding="utf-8" влияет только на запросы GET.GET поставляется с параметрами в URL запроса (как вы видите в адресной строке браузера).Однако параметры запроса POST находятся в теле запроса, а не в URL-адресе запроса.Вы хотите использовать request.setCharacterEncoding("UTF-8") здесь.Вы можете сделать это в классе Filter, который сопоставлен с FacesServlet.

Однако по умолчанию JSF уже должен был позаботиться об этом, основываясь на кодировке страницы (если вы используете Facelets),Вы уверены, что это не просто консоль stdout / logging, которая использует неверную кодировку для отображения параметров?

См. Также:

1 голос
/ 28 марта 2014

Я трачу много времени на поиск решения этой проблемы. Кажется, где-то есть ошибка в JSF2 / Tomcat / Glassfish. Значения параметров искажаются только при первом вызове после создания сеанса jsf. Последующие вызовы работают нормально - заголовки запроса такие же, как и в первом (не работающем) запросе, за исключением наличия jsession id Это также доказывает, что это не проблема неправильной конфигурации для utf-8.

Мне пришлось реализовать разные решения для Glassfish и Tomcat. После этих изменений все работает нормально. Конечно, это обходной путь, единственное правильное решение - это исправить ошибку.

Glassfish: дополнительная строка в glassfish-web.xml

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

Tomcat: я не нашел эквивалентного параметра конфигурации для Tomcat, мне пришлось добавить дополнительный фильтр сервлета

package cz.cksvec.filters;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class UTF8Filter implements Filter {

    @Override
    public void init(FilterConfig fc) throws ServletException {}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, 
            FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {}
}

и раздел web.xml для активации фильтра:

<filter>
    <filter-name>UTF8Filter</filter-name>
    <filter-class>cz.cksvec.filters.UTF8Filter</filter-class>
</filter>

<filter-mapping>
    <filter-name>UTF8Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>    
0 голосов
/ 02 апреля 2012

Как говорит BalusC, конфигурация tomcat предназначена только для запросов GET.Для POSTing multipart / form-data вам нужно создать фильтр, который вызывает

request.setCharacterEncoding("UTF-8");

до того, как будет сделан любой запрос request.getParameter ().

Вы можете вырезать и вставить из моего блогаесли вы хотите попробовать это быстро.

http://www.ninthavenue.com.au/servletrequest-setcharactercoding-ignored

...