一、请求(Request)乱码问题及解决方案
1. POST 请求参数乱码
原因分析:
当客户端(如浏览器)提交表单数据时,默认使用 UTF-8 编码发送内容。然而,像 Tomcat 这类服务器在未做特殊配置的情况下,会以 ISO-8859-1 字符集来解析请求体(request body),从而导致中文字符出现乱码现象。
解决方法:
在获取请求参数之前,显式设置请求的字符编码为 UTF-8:
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
注意:此设置必须在调用 request.getParameter() 方法前执行,否则无法生效。
getParameter()
2. GET 请求参数乱码
原因分析:
GET 请求将参数附加在 URL 后面(例如:?name=张三)。Tomcat 默认使用 ISO-8859-1 对 URL 路径和查询字符串进行解码,因此中文参数容易出现乱码。
解决方案(可任选其一):
方法①:手动重新编码(传统处理方式)
先以 ISO-8859-1 获取原始字节流,再用 UTF-8 重新解码:
String name = request.getParameter("name"); // 当前可能是乱码(ISO-8859-1 编码)
name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
方法②:修改 Tomcat 配置(推荐做法)
通过修改 Tomcat 的配置文件 server.xml,在 Connector 标签中添加 URIEncoding 属性:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" />
完成该配置后,所有 GET 请求中的参数都将自动按照 UTF-8 进行解码,无需额外编码处理。
/login?name=张三conf/server.xml<Connector>URIEncoding="UTF-8"
二、响应(Response)乱码问题
即使请求参数已正确处理,若未对响应设置合适的字符编码,返回给浏览器的内容仍可能出现中文乱码。
设置响应编码的方法如下:
方式1:设置内容类型与字符集(推荐用于文本输出)
使用以下代码同时指定 MIME 类型和字符编码:
response.setContentType("text/html;charset=UTF-8");
方式2:单独设置响应字符编码(较少使用)
仅设置字符编码:
response.setCharacterEncoding("UTF-8");
注意事项:
调用 setContentType 方法不仅设置内容类型,还会设置 HTTP 响应头中的 Content-Type 字段,确保浏览器能正确识别并解码响应内容。
setContentType()Content-Type: text/html;charset=UTF-8
三、最佳实践建议
- 在整个项目中统一采用 UTF-8 字符编码,涵盖前端页面、Java 源码、数据库存储以及服务器配置等环节。
- 建议在全局过滤器或初始化配置中统一设置 request 和 response 的编码格式,避免在每个 Servlet 中重复编写相同代码。
示例:通用字符编码过滤器
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
req.setCharacterEncoding("UTF-8");
res.setContentType("text/html;charset=UTF-8");
chain.doFilter(req, res);
}
对于新开发的项目,推荐使用 Spring Boot 等现代框架,其默认已集成完善的字符编码处理机制,可有效减少此类问题的发生。
web.xml

雷达卡


京公网安备 11010802022788号







