Java Web 中文乱码问题全解析:GET/POST 请求编码解决方案
中文乱码是 Java Web 开发中常见的问题,根源在于请求参数编码与解码方式不匹配。GET 和 POST 请求的参数传递方式不同,乱码原因和解决方案也存在差异。本文将详细分析中文乱码的成因,并提供针对性的解决方法,覆盖 Tomcat 配置、代码处理等多种场景。
中文乱码的本质原因
HTTP 协议默认使用 ISO-8859-1 编码(不支持中文),若客户端发送的中文参数使用 UTF-8 编码,而服务器端用 ISO-8859-1 解码,就会导致乱码(表现为 ??? 或一串无意义字符)。
- GET 请求:参数附加在 URL 中,编码由服务器的 URI 编码配置决定;
- POST 请求:参数放在请求体中,编码由
Content-Type头的charset指定,若未指定则默认使用 ISO-8859-1。
GET 请求中文乱码解决方案
GET 请求参数通过 URL 传递,其编码处理依赖服务器配置(如 Tomcat 的 URI 编码设置),常见解决方案如下:
方案一:修改 Tomcat 配置(推荐)
在 Tomcat 的 conf/server.xml 中,为 Connector 节点添加 URIEncoding="UTF-8" 属性,强制服务器对 URI 中的参数使用 UTF-8 解码:
1 | <Connector port="8080" protocol="HTTP/1.1" |
- 作用:所有 GET 请求的 URL 参数均使用 UTF-8 解码,一劳永逸解决乱码;
- 适用场景:有权限修改服务器配置的环境(如开发、测试环境)。
方案二:使用请求体编码同步 URI 编码
若无法修改 Tomcat 配置,可在 Connector 中添加 useBodyEncodingForURI="true",使 URI 编码与请求体编码保持一致: