Web请求乱码解决方案

一、请求(Request )乱码

✅ 1. POST 请求参数乱码

原因:
  • 客户端(浏览器)默认以 UTF-8 编码发送表单数据。

  • 但 Tomcat 等服务器默认使用 ISO-8859-1 解码请求体(request body),导致中文乱码。

解决方案:

在读取参数前,设置 request 的字符编码为 UTF-8

复制代码
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");

⚠️ 必须在调用 getParameter() 之前设置,否则无效。


✅ 2. GET 请求参数乱码

原因:
  • GET 请求的参数附加在 URL 中(如 /login?name=张三)。

  • Tomcat 默认使用 ISO-8859-1 解码 URL 路径和查询字符串(query string)。

解决方案(任选其一):
方法①:手动重新编码(传统方式)
复制代码
String name = request.getParameter("name"); // 此时是乱码(ISO-8859-1 编码)
// 先用 ISO-8859-1 获取原始字节,再用 UTF-8 重新解码
name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
方法②:配置 Tomcat(推荐)

conf/server.xml 中,为 <Connector> 添加 URIEncoding="UTF-8"

复制代码
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           URIEncoding="UTF-8" />

✅ 配置后,所有 GET 请求参数将自动按 UTF-8 解码,无需代码处理。


二、响应(Response)乱码

即使请求参数正确,如果响应未设置编码,返回给浏览器的中文仍可能乱码。

✅ 设置响应编码:

复制代码
// 方式1:设置字符流编码(推荐用于文本)
response.setContentType("text/html;charset=UTF-8");
​
// 方式2:单独设置字符编码(较少用)
response.setCharacterEncoding("UTF-8");

🔔 注意:setContentType() 会同时设置响应头 Content-Type: text/html;charset=UTF-8,确保浏览器正确解码。

三、最佳实践建议

  1. 统一使用 UTF-8 编码(前端页面、数据库、Java 代码、服务器配置)。

  2. web.xml 或过滤器中统一设置 request/response 编码(避免每个 Servlet 重复写)。

    复制代码
    // 示例:通用编码过滤器
    public void doFilter(ServletRequest req, ServletResponse res, ...) {
        req.setCharacterEncoding("UTF-8");
        res.setContentType("text/html;charset=UTF-8");
        chain.doFilter(req, res);
    }
  3. 对于新项目,使用 Spring Boot 等框架,默认已处理好编码问题。

相关推荐
wuqingshun3141592 小时前
MYSQL的乐观锁和悲观锁是什么?
java
唐青枫3 小时前
Java SLF4J 实战指南:从日志门面到 Logback、MDC 和链路追踪
java
jvmind_dev3 小时前
Java GC 实战指南(番外篇):被忽视的隐形杀手 —— Class Unloading 如何拖垮 GC
java·后端
An_s3 小时前
机器学习python之识别图中物品信息
java·linux·开发语言
AIGS0014 小时前
跨越语义鸿沟:企业本体语义平台的构建与落地
java·人工智能·python·机器学习·人工智能ai大模型应用
蓝田~5 小时前
大模型本地部署与远程调用 — 从 API 到 Agent
java·人工智能·claude·claude code
码农进化录5 小时前
Java 程序员的 AI 进化论 | Spring Boot 接入 OpenAI 的六个坑,全帮你踩了
java·spring boot·openai
疯狂成瘾者5 小时前
Java 常见集合方法
java·windows·python
从此以后自律5 小时前
ConcurrentHashMap 超详细详解
java
兰令水5 小时前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试