我一直在讨论使用Spring MVC 3.1.1构建的Tomcat Web应用程序的编码问题。
问题
通过Freemarker弹簧宏绑定的表单输入字段值Spring宏被解码为ISO-8859-1而不是UTF-8。
当前配置
我已将freemarker配置为以UTF-8编码所有内容。
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/templates/" />
<property name="freemarkerSettings">
<props>
<prop key="auto_import">spring.ftl as spring</prop>
<prop key="url_escaping_charset">UTF-8</prop>
</props>
</property>
</bean>
这是我在web.xml文件中设置的字符编码过滤器。
<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>
HTML标记头标记包含:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
UTF-8编码非常适合显示我的freemarker视图中返回的数据,但绑定形成值的数据除外,如下面的输入。
<form id="main-search-form" action="search" method="GET">
<@spring.formInput 'searchForm.q' 'id="q" maxlength="2048" autocomplete="off" spellcheck="false"'/>
</form>
据我所知,在网上阅读了几个小时之后,在大多数情况下,Spring似乎默认为ISO-8859-1,但我没有找到一个覆盖的bean来改变解码类型对于绑定数据。即使HTTP请求以UTF-8编码并且tomcat容器的Connector节点设置为URIEncode =“UTF-8”,Spring也会尝试使用ISO-8859-1进行解码。
任何帮助都将不胜感激。
答案 0 :(得分:1)
在我的桌子上敲了几个小时后,我想我终于弄明白了问题是什么。我上面的配置都是正确的(包括Tomcat连接器属性, URIEncode =“UTF-8”)。
我错误地认为是Spring MVC通过表单提交来处理我的GET请求的编码。
但是,表单标记实际上只是一个问题。我需要将表单字符集指定为UTF-8。
<form id="main-search-form" action="search" method="GET" accept-charset="UTF-8">
...
</form>
这与上述配置相结合,解决了我的问题。
答案 1 :(得分:1)
我需要指定
<form ... accept-charset="UTF-8"> ...
将我的UTF-8字符正确提交给后端。