做j2ee web项目,很多时候都直接在jsp页面设置编码为:GBK。而在表单中提交数据到后台服务时遇到中文乱码,我们也会轻车熟路的在web.xml中增加编码过滤器:
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注:此过滤器只对post方式提交的数据有效,get方式需要采用另外的方法解决。
但用到ajax提交数据时,发现该过滤器失效,中文数据到后台,还是乱码。网上关于ajax提交数据成乱码的解决方法很多,在实际的项目开发中并不好用。在此仅提供另一种解法方法,作为一种参考。
分析:ajax提交数据时,是将数据进行UTF-8编码后发送的,请求数据到达过滤器进行解码时,UTF-8和GBK并不是兼容型编码。所以经过过滤器后还是乱码。如果将过滤器的编码设置为:UTF-8则可以正确解码中文数据。但这样一来,jsp页面提交的数据又会出现乱码。所以可以考虑配置两个过滤器,配置一个针对ajax请求的过滤器。
<filter>
<filter-name>Set Character Encoding</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>Set Character Encoding</filter-name>
<url-pattern>/ajax/*</url-pattern>
</filter-mapping>
在映射请求路径时,需要与前一个过滤器有所区别,如针对ajax请求的url-pattern:/ajax/* 在用到ajax请求的地方,需要注意将ajax请求的url带上ajax标识。这样ajax请求会先经过utf-8过滤器的处理,此时已经无乱码,再经过第一个过滤器的处理。最后到后台程序时,数据已经无乱码问题了。
此方法需要约定ajax请求的url遵循一定的规则。