Spring MVC + Hibernate编码问题

时间:2010-03-19 00:30:26

标签: java hibernate spring encoding spring-mvc

我在Spring MVC + Hibernate应用程序上工作,使用MySQL(版本5.0.51a)和InnoDB引擎。

当我发送带有西里尔字符的表单时,会出现问题。 结果,数据库包含未知编码的无意义字符。

使用UTF-8创建的所有JSP页面,数据库(+表和字段)。 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 个答案:

答案 0 :(得分:3)

您的JSP文件必须以两种方式为UTF-8:

  • 标题<%@page pageEncoding="UTF-8" %>
  • 他们在eclipse中的内容 - right-click > properties并在那里编码UTF-8(它可能会拒绝转换它,因此剪切当前内容,更改编码,然后粘贴它回)

然后spring对于这种情况有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,否则任何过滤器都不会产生重大性能损失。

答案 1 :(得分:2)

这是您进行正确编码转换的代价:UTF-8(请求) - &gt; UTF-16(Java) - &gt; UTF-8(DB)。

如果它(转换)占用整个请求时间的百分之几,我会感到惊讶。如果确实如此,恕我直言的做错了。

  

使用UTF-8

创建的所有JSP页面

您的容器是否将UTF-8设置为页面编码? (请参阅生成的页面属性)。如果是,则不需要设置过滤器,浏览器将以UTF-8提交表单。