【问题标题】:Spring MVC + Hibernate encoding problemSpring MVC + Hibernate 编码问题
【发布时间】:2010-03-19 00:30:26
【问题描述】:

我在 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>

【问题讨论】:

  • 像这样更改请求对象中的字符编码应该不会对应用程序的速度产生明显影响。一定有别的事情发生了
  • 你有没有将doFilter()方法声明为syncrhonized

标签: java hibernate spring encoding spring-mvc


【解决方案1】:

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

  • 标题&lt;%@page pageEncoding="UTF-8" %&gt;
  • 他们的内容 - right-click &gt; properties 在 eclipse 中并在那里将他们的编码设为 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

【讨论】:

  • @Bozko。我在标题和页面中都有 UTF-8。 doFilter() 方法不包含关键字«synchronized»。似乎放慢速度只是我的主观感受。 CharacterEncodingFilter 工作正常!谢谢。
  • -1 表示“如果这不起作用”。如果您的页面不是ISO-8859-1(在浏览器端),您必须使用CharacterEncodingFilter 来正确处理非us-ascii 输入(除非您的servlet 容器违反此处的servlet 规范,例如Jetty)。
  • @axtavt 我修复了那个小细节。
  • 所以过滤器将转换发布的表单值或?
【解决方案2】:
猜你喜欢
  • 2014-03-15
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 2014-12-01
  • 1970-01-01
  • 2011-08-04
  • 2019-10-02
相关资源
最近更新 更多