Tomcat 处理包含中文的请求乱码问题

背景

流程引擎 Camunda 需要部署在 Tomcat 上,之前部署和使用的时候发现,如果请求内容中包含中文(无论采用 GET 还是 POST),经过 Camunda 处理之后存在数据库中,内容会乱码。

经搜索,找到一个可能的原因是:如果没有指定字符编码,Servlet 规范规定使用 ISO-8859-1 作为默认的编码。

GET 请求

修改 Tomcat 的 conf 目录下的 server.xml,将 Connector 中指定 URIEncoding="UTF-8",如下。

1
2
3
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" useBodyEncodingForURI="true" />

POST 请求

POST 请求需要指定它发送的参数和值的编码,因为大多数客户端并没有设置一个明确的编码,默认采用的是 ISO-8859-1。

大多数情况下,这并不是我们想要的编码,我们可以使用过滤器来进行控制,Tomcat 已经提供了完成这个功能的过滤器的例子或者内置了,只要启用即可。

1
2
3
4
5
6
7
8
9
10
11
12
<!-- conf/web.xml -->
...
<filter>
<filter-name>setCharacterEncodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<async-supported>true</async-supported>
</filter>
...