当前位置: 首页 > news >正文

JavaWeb 请求与响应乱码问题全面解决方案

JavaWeb 请求与响应乱码问题全面解决方案

乱码问题是 JavaWeb 开发中的常见挑战,主要源于字符编码不一致。以下是系统化的解决方案:


一、请求乱码问题(客户端 → 服务器)
1. GET 请求乱码

原因:URL 参数默认使用 ISO-8859-1 编码
解决方案

// 方法1:修改 Tomcat 配置 (server.xml)
<Connector port="8080" URIEncoding="UTF-8" .../>// 方法2:代码转换
String param = request.getParameter("name");
param = new String(param.getBytes("ISO-8859-1"), "UTF-8");// 方法3:URL 重写时手动编码
String url = "?name=" + URLEncoder.encode("中文", "UTF-8");
2. POST 请求乱码

原因:请求体未正确设置编码
解决方案

// 在获取参数前设置编码
request.setCharacterEncoding("UTF-8");// 若使用过滤器全局设置:
public class EncodingFilter implements Filter {public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {req.setCharacterEncoding("UTF-8");chain.doFilter(req, resp);}
}
3. AJAX 请求乱码
// 前端设置
$.ajax({url: "api",contentType: "application/x-www-form-urlencoded; charset=UTF-8",data: {name: "中文"}
});// 后端配合
request.setCharacterEncoding("UTF-8");

二、响应乱码问题(服务器 → 客户端)
1. 文本响应乱码

解决方案

// 方法1:设置响应头 (必须最先执行)
response.setContentType("text/html;charset=UTF-8");// 方法2:双重设置 (兼容性最佳)
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");// 方法3:使用 PrintWriter 前设置
PrintWriter out = response.getWriter();
response.setContentType("text/html;charset=UTF-8"); // 错误!此时已失效
2. JSON 响应乱码
// Spring MVC 解决方案
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();converter.setDefaultCharset(StandardCharsets.UTF_8);converters.add(converter);}
}// 原生 Servlet
response.setContentType("application/json;charset=UTF-8");
String json = "{\"name\":\"张三\"}";
response.getWriter().write(json);
3. 文件下载乱码
// 文件名乱码解决
String fileName = "中文文件.txt";
String encodedName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"); // 空格处理response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + encodedName);

三、JSP 页面乱码
1. 页面本身乱码
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
2. EL 表达式乱码
<!-- web.xml 配置 -->
<jsp-config><jsp-property-group><url-pattern>*.jsp</url-pattern><page-encoding>UTF-8</page-encoding></jsp-property-group>
</jsp-config>
3. JSP 包含乱码
<%-- 在父页面设置 --%>
<%@ page contentType="text/html;charset=UTF-8" %><%-- 包含时指定编码 --%>
<jsp:include page="child.jsp" flush="true"><jsp:param name="param" value="<%= URLEncoder.encode("中文","UTF-8") %>"/>
</jsp:include>

四、数据库乱码问题
1. 连接字符串设置
// JDBC URL 添加参数
String url = "jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8";
2. 数据库/表级别设置
CREATE DATABASE db DEFAULT CHARACTER SET utf8mb4;CREATE TABLE table (...
) DEFAULT CHARSET=utf8mb4;

五、综合解决方案框架
1. 过滤器配置 (web.xml)
<filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param>
</filter>
<filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
2. 服务器级配置
服务器配置文件关键配置项
Tomcatserver.xml<Connector URIEncoding="UTF-8">
Jettyjetty.xml<Set name="requestEncoding">UTF-8</Set>
WebLogicweblogic.xml<charset-params> <input-charset> <resource-path>/*</resource-path> <java-charset-name>UTF-8</java-charset-name> </input-charset> </charset-params>

六、乱码排查流程图
请求乱码
GET
POST
AJAX
响应乱码
出现乱码
请求 or 响应
GET/POST/AJAX?
检查Tomcat URIEncoding
检查setCharacterEncoding
检查Content-Type头
检查setContentType
是否在getWriter之前设置
检查数据库连接参数
检查文件操作编码
检查操作系统默认编码

七、终极校验表
检查点正确配置常见错误值
请求编码request.setCharacterEncoding(“UTF-8”)缺失或错误编码
响应Content-Typetext/html;charset=UTF-8缺少charset
JSP pageEncoding<%@ page pageEncoding=“UTF-8”%>缺失或ISO-8859-1
数据库连接characterEncoding=UTF-8缺失或错误编码
文件读取new InputStreamReader(fis, “UTF-8”)使用系统默认编码
操作系统编码UTF-8GBK 或其它本地化编码

黄金法则

  1. 全程使用 UTF-8 编码
  2. 请求处理前设置编码
  3. 响应输出前设置 Content-Type
  4. 所有环节显式指定编码(不要依赖默认值)
http://www.dtcms.com/a/337276.html

相关文章:

  • React diff——差异协调算法简介
  • 算法-决策树
  • 从决策树基础到熵与信息增益
  • 网络间的通用语言TCP/IP-网络中的通用规则1
  • 本地文件上传到gitee仓库的详细步骤
  • sem_post函数的定义及作用
  • 【81页PPT】国内某知名大型制药企业制药数字化转型项目汇报方案(附下载方式)
  • 无人设备遥控器之操控信号精度篇
  • 【68页PPT】MES系统数字化工厂解决方案(附下载方式)
  • 深入剖析以太坊虚拟机(EVM):区块链世界的计算引擎
  • go 多版本共存【goup + alias方案】
  • React diff Vue diff介绍
  • 【2025CVPR-目标检测方向】RaCFormer:通过基于查询的雷达-相机融合实现高质量的 3D 目标检测
  • 牛子图论进阶
  • TEST_
  • Linux系统启动原理及故障排除
  • 场外个股期权的行权日是t+多少个交易日?
  • 【牛客刷题】最大公约数与最小公倍数:算法详解与实现
  • linux中的hostpath卷与nfs卷以及静态持久卷的区别
  • JAiRouter 架构揭秘:一个面向 AI 时代的响应式网关设计
  • Flutter 自定义 Switch 切换组件完全指南
  • 技术经典场景之协议转换
  • IR-CUT与CCD CMOS的关系
  • 国标:开展环境卫生满意度调查
  • 【P18 3-10】OpenCV Python—— 鼠标控制,鼠标回调函数(鼠标移动、按下、。。。),鼠标绘制基本图形(直线、圆、矩形)
  • 【笔记】和各大AI大语言模型合作写项目—slirp.go
  • 之前说的要写的TCP高性能服务器,今天来了
  • 算法题打卡力扣第26. 删除有序数组中的重复项(easy))
  • 日语学习-日语知识点小记-进阶-JLPT-N1阶段蓝宝书,共120语法(4):31-40语法
  • 在react props中在参数中定义参数类型