Невозможно получить сервлет для обработки содержимого запроса как UTF-8 - PullRequest
1 голос
/ 14 июля 2009

Я конвертирую старое приложение из ISO-8859-1 в UTF-8, и я использовал ряд ресурсов, чтобы определить, что мне нужно установить, чтобы заставить это работать. Однако после нескольких изменений конфигурации, кода и среды мой сервлет (в Tomcat 5), похоже, не обрабатывает отправленное содержимое HTML-формы как UTF-8.

Вот что я настроил для настройки.

  • Свойства системы
[user@server ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
  • tomcat5 server.xml
<Connector protocol="HTTP/1.1"
    ...
    URIEncoding="UTF-8"
    useBodyEncodingForURI="true"/>
  • файл JSP
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>
...
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  • Фильтр сервлетов
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
{
    if(request.getCharacterEncoding() == null)
    {
        request.setCharacterEncoding("UTF-8");
    }
    ...

С некоторыми журналами отладки я знаю следующее:

System.getProperty("file.encoding"): "UTF-8"
java.nio.charset.Charset.defaultCharset(): "UTF-8"
new OutputStreamWriter(new ByteArrayOutputStream()).getEncoding(): "UTF8"

Однако, когда я отправляю свою форму со входом, содержащим «Бить баклуши», я вижу следующее (из моих журналов):

request.getParameter("myParameter") = Ð\221иÑ\202Ñ\214 баклÑ\203Ñ\210Ð

Я знаю, что тип содержимого запроса был null, поэтому он был явно установлен на "UTF-8" в моем фильтре сервлетов. Кроме того, я просматриваю свои логи с терминала, кодировка которого, как мне известно, также установлена ​​на UTF-8.

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

Edit:

  • Я не использую Windows Terminal (я использую PuTTY), поэтому я уверен, что проблема не в том, с чем я просматриваю логи. Это подтверждается тем фактом, что когда я отправляю свой ответ обратно в браузер с отправленным контентом и выводю его, это тот же мусор, что и выше.
  • Форма отправляется из IE8.

Решение:

Мое web.xml определение для моего CharsetFilter было слишком далеко (ниже конфигураций моего сервлета и других фильтров). Я переместил определение фильтра в самый верх документа web.xml, и все заработало правильно. Смотрите принятый ответ ниже.

Ответы [ 2 ]

5 голосов
/ 14 июля 2009

Edit4 (окончательный и исправленный ответ по запросу)

Ваш фильтр сервлетов применяется слишком поздно.

Возможный правильный порядок будет в web.xml следующим образом

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/j2ee/dtds/web-app_2.3.dtd">

<web-app>
    <!--CharsetFilter start--> 
    <filter>
        <filter-name>Charset Filter</filter-name>
        <filter-class>CharsetFilter</filter-class>
        <init-param>
            <param-name>requestEncoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <!-- The rest is ommited -->
1 голос
/ 18 апреля 2017

Сначала я думал, что проблема легко решится, но мне потребовалось 2 дня, чтобы понять это. Вот моя находка, и я надеюсь, что это поможет 1) Вы должны иметь код ниже в вашем JSP

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

если у вас много JPS-страниц, то вы можете использовать приведенный ниже код в web.xml, как описано здесь: Как правильно установить pageEncoding для всех моих JSP?

2) Убедитесь, что перед прочтением любого параметра в вашем сервлете вы уже установили кодировку символов в UTF-8

request.setCharacterEncoding("UTF-8");

Я сделал это в своем собственном фильтре (первый фильтр перед chain.doFilter.

3) Ваша база данных должна поддерживать UTF-8, поэтому убедитесь, что вы уже применили изменения к своей таблице и столбцам. Чтобы убедиться, что он работает нормально, просто введите несколько слов на японском и сохраните. Если таблица содержит содержимое, то это нормально.

4) Последним и наиболее важным является строка подключения к вашей базе данных. Хотя все мои БД и таблицы поддерживали UTF8, но эта дополнительная строка была причиной, по которой я мог сохранить свой контент в базе данных. Поэтому убедитесь, что вы добавили characterEncoding = UTF8 в строку подключения, как показано ниже

jdbc:mysql://127.0.0.1:3306/my_daabase?characterEncoding=UTF8

Для страниц JSP с enctype = "multipart / form-data" вам нужно будет сделать один дополнительный шаг. Когда вы читаете FileItem с помощью метода getString, убедитесь, что вы изменили его на getString ("UTF-8"), тогда это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...