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 等框架,默认已处理好编码问题。

相关推荐
程序员游老板39 分钟前
基于SpringBoot3_vue3_MybatisPlus_Mysql_Maven的社区养老系统/养老院管理系统
java·spring boot·mysql·毕业设计·软件工程·信息与通信·毕设
福尔摩斯张1 小时前
C++核心特性精讲:从C语言痛点出发,掌握现代C++编程精髓(超详细)
java·linux·c语言·数据结构·c++·驱动开发·算法
@淡 定1 小时前
Spring中@Autowired注解的实现原理
java·后端·spring
时空无限1 小时前
Java Buildpack Reference
java·开发语言
爱笑的眼睛112 小时前
超越剪枝与量化:下一代AI模型压缩工具的技术演进与实践
java·人工智能·python·ai
阿里云云原生2 小时前
Android App 崩溃排查指南:阿里云 RUM 如何让你快速从告警到定位根因?
android·java
历程里程碑2 小时前
C++ 9 stack_queue:数据结构的核心奥秘
java·开发语言·数据结构·c++·windows·笔记·算法
醇氧3 小时前
【Windows】从守护到终结:解析一个 Java 服务的优雅停止脚本
java·开发语言·windows
努力发光的程序员3 小时前
互联网大厂Java求职面试实录
java·jvm·线程池·多线程·hashmap·juc·arraylist
小鹿学程序3 小时前
FileZilla连接到虚拟机
java·服务器·开发语言