最近处理一个项目,从WebSphere迁移到Tomcat上。结果form表单submit提交的时候中文乱码(Ajax方式及ajaxForm方式也正常)
进行如下常规检查:
1、IDE编码设置检查
文件编码(JSP、Java、XML等);工作区编码、工程编码。均设置为UTF-8
2、Tomcat配置
server.xml中设置UTF-8 URIEncoding="UTF-8"
3、Spring Filter
顺序要放到xml最前面,否则可能受其他Filter影响。
<!-- Apache Shiro -->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
```
4、SpringMVC
设置请求信息转换器。其他的自行补充
```xml
<!-- 默认的注解映射的支持,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping -->
<!-- 将StringHttpMessageConverter的默认编码设为UTF-8 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" />
</bean>
<div class="se-preview-section-delimiter"></div>
5、页面设置
“`
5、页面设置
```html
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
整体检查了一遍后,确定都这些设置都没有问题。
1、按照不同的项目同一个Web容器测试;
2、不同的Web容器同一个项目测试。
结果:
1、纯净的项目在任何Web容器都正常
2、该项目在WebSphere、Jetty下不需要改动均正常,只有Tomcat下才会乱码。
原因:
1、WebSphere运行时编码取自系统默认编码,Jetty默认编码是UTF-8,如果系统有设置取系统编码。Tomcat get 编码默认是 ISO-8859-1 ,可以通过 Connector 上 URIEncoding 设定编码,也可以强制 useBodyEncodingForURI =true 让 URI 和 body 编码一致。
2、问题出在该项目上。
原程序中删减配置文件,从web.xml开始 到SpringMVC、Spring Shiro、quartz等配置文件。逐步剔除并运行测试。最后发一个监听RequestListener的listener类继承了ServletRequestListener。造成该项目乱码。
直接再该类上设置’request.setCharacterEncoding(“UTF-8”);’解决此问题。