Spring MVC + Hibernate проблема кодирования - PullRequest
3 голосов
/ 19 марта 2010

Я работаю в приложении Spring MVC + Hibernate, использую MySQL (версия 5.0.51a) с движком InnoDB.

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

Все страницы JSP, база данных (+ таблицы и поля), созданные с использованием UTF-8. Конфигурация Hibernate также содержит свойство, которое устанавливает кодировку в UTF-8.

Я решил эту проблему, создав фильтр, который кодирует содержимое запроса с помощью UTF-8. Примерный код:

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

Но приложение заметно замедляет работу.

Интересно то, что выполнение запроса вставки непосредственно из приложения (т. Е. Запуска из Eclipse как Java-приложения) работает отлично.

UPD.

Насколько я понял, использование фильтра - единственное рабочее решение в моем случае.

Я не знал о стандартном CharacterEncodingFilter. Используйте это сейчас, работает очень хорошо!

<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping>

Ответы [ 2 ]

3 голосов
/ 19 марта 2010

Ваши JSP-файлы должны быть в формате UTF-8 двумя способами:

  • заголовок <%@page pageEncoding="UTF-8" %>
  • их содержимое - right-click > properties в Eclipse и создайте там их кодировку UTF-8 (он может отказать в преобразовании, поэтому вырезает текущий контент, изменит кодировку и вставит его обратно) 1010 *

Тогда у пружины есть CharacterEncodingFilter для этого случая, который не должен иметь какого-либо существенного снижения производительности:

<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

На самом деле ни у одного фильтра не должно быть существенного снижения производительности, если только не объявлен его метод doFilter() synchronized.

2 голосов
/ 19 марта 2010

Это ваша цена за правильное преобразование кодировки: UTF-8 (запрос) -> UTF-16 (Java) -> UTF-8 (DB).

Я был бы удивлен, хотя, если бы это (преобразование) заняло больше чем несколько процентов общего времени запроса.Если это так, то что-то сделано неправильно IMHO.

Все страницы JSP ... созданы с использованием UTF-8

Ваш контейнер устанавливает UTF-8 в качестве кодировки страницы?(См. Сгенерированные свойства страницы).Если это произойдет, вам не нужно устанавливать фильтр, браузер отправит форму обратно в UTF-8.

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