Java Spring MVC+;Hibernate编码问题
我在SpringMVC+Hibernate应用程序上工作,在InnoDB引擎上使用MySQL(5.0.51a版) 当我发送带有西里尔字母的表单时,会出现问题。 结果,数据库包含未知编码的无意义字符 使用UTF-8创建的所有JSP页面、数据库(+表和字段)。 Hibernate配置还包含将编码设置为UTF-8的属性 我通过创建过滤器解决了这个问题,该过滤器使用UTF-8编码请求内容。 示例代码:Java Spring MVC+;Hibernate编码问题,java,hibernate,spring,encoding,spring-mvc,Java,Hibernate,Spring,Encoding,Spring Mvc,我在SpringMVC+Hibernate应用程序上工作,在InnoDB引擎上使用MySQL(5.0.51a版) 当我发送带有西里尔字母的表单时,会出现问题。 结果,数据库包含未知编码的无意义字符 使用UTF-8创建的所有JSP页面、数据库(+表和字段)。 Hibernate配置还包含将编码设置为UTF-8的属性 我通过创建过滤器解决了这个问题,该过滤器使用UTF-8编码请求内容。 示例代码: … encoding = "UTF-8"; request.setCharacterEncoding(
…
encoding = "UTF-8";
request.setCharacterEncoding(encoding);
chain.doFilter(request, response);
…
但它明显减慢了应用程序的速度
有趣的是,直接从应用程序执行insert查询(即作为Java应用程序从Eclipse运行)工作得非常完美
UPD.
据我所知,在我的案例中,使用过滤器是唯一有效的解决方案
我不知道标准字符编码过滤器。现在就用吧,效果很好
<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>
字符编码滤波器
org.springframework.web.filter.CharacterEncodingFilter
编码
UTF-8
强制编码
真的
字符编码滤波器
*
正确编码转换的代价是:UTF-8(请求)->UTF-16(Java)->UTF-8(数据库)
不过,如果(转换)花费的时间超过总请求时间的百分之几,我会感到惊讶。如果是这样的话,我觉得有些事情做错了
所有的JSP页面。。。使用UTF-8创建
您的容器是否将UTF-8设置为页面编码?(请参见生成的页面属性)。如果是,您不需要设置过滤器,浏览器将以UTF-8格式提交表单 您的JSP文件必须以两种方式为UTF-8:
- 标题
- 它们的内容-
在eclipse中右键单击>属性,并将其编码设置为UTF-8(它可能会拒绝转换,因此剪切当前内容,更改编码,然后将其粘贴回去)
<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>
字符编码滤波器
org.springframework.web.filter.CharacterEncodingFilter
编码
UTF-8
强制编码
真的
实际上,任何过滤器都不应该有显著的性能影响,除非它的
doFilter()
方法被声明为synchronized
浏览器通常在提交表单时不发送编码,servlet容器假定它是ISO-8859-1
,因此,在这种情况下,过滤器是唯一正确的解决方案。生成的页面包含该行,但正如我所提到的,没有过滤器就不会成功。如果您认为转换过程是一种过程,那么在这种情况下有什么更好的解决方案呢?浏览器确实发送编码——与页面的原始编码相同,即UTF-8。否则,我们这些非拉丁人将如何提交我们的多字节表格D@Bar,跟踪HTTP请求(例如,使用Firefox的FireBug或TamperData),并查看来自服务器的内容和流向服务器的内容。检查Content-Transfer-Encoding的标题。像这样更改请求对象中的字符编码不会对应用程序的速度产生明显影响。一定是发生了其他事情。您有可能将doFilter()
方法声明为syncrhonized
?@Bozko。我在页眉和页面中都有UTF-8。doFilter()方法不包含关键字«synchronized»。似乎减速只是我的主观感受。CharacterEncodingFilter工作正常!谢谢。-1“如果这不起作用”。如果您的页面不是ISO-8859-1
(在浏览器端),则必须使用CharacterEncodingFilter
正确处理非美国ascii输入(除非您的servlet容器违反此处的servlet规范,如Jetty)。@axtavt I修复了该微小细节。因此筛选器将转换发布的表单值或?