1. 主页 > 小妙招

解决JSP参数传递中文乱码的3个实战技巧,为何GET请求总显示问号?


一、乱码根源定位:你的字符编码统一了吗?

??问:为什么GET请求中文参数变成"???"???
答:Tomcat默认使用ISO-8859-1解码URL参数。当浏览器用UTF-8发送中文时,相当于用错误的密码本解密数据。

??3个关键检查点??:

  1. 页面编码声明:<%@ page contentType="text/html;charset=UTF-8" %>
  2. 请求解码设置:request.setCharacterEncoding("UTF-8")
  3. 响应编码配置:response.setContentType("text/html;charset=UTF-8")

二、POST请求乱码修复:三步永久解决方案

??实战步骤??:

  1. ??拦截器配置??:在Filter中强制设定编码
java复制
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);
}
  1. ??JSP页面验证??:添加元标签校验

  2. ??服务器配置??:修改Tomcat的server.xml

xml复制
<Connector port="8080" URIEncoding="UTF-8" 
           useBodyEncodingForURI="true"/>

三、GET请求终极方案:双重编码解码法

??现象复现??:product_list.jsp?keyword=手机显示为"???"

??解决步骤??:

  1. 前端进行URL编码:
javascript复制
// 在表单提交前处理
encodeURIComponent(document.getElementById("keyword").value)
  1. 后端手动解码:
java复制
String param = new String(request.getParameter("key").getBytes("ISO-8859-1"), "UTF-8");
  1. 使用Apache工具类优化:
java复制
String decodedParam = URLDecoder.decode(request.getParameter("key"), "UTF-8");

四、方案对比:哪种编码方式最适合你?

对比维度POST过滤器方案GET双重编解码全局URI编码
实现复杂度中等较高简单
维护成本最低
适用范围表单提交超链接传参全站通用
服务器影响需重启生效即时生效需重启
推荐指数★★★★☆★★★☆☆★★★★★

五、避坑经验:十年老程序员踩过的雷

某电商系统曾因编码问题导致2000+用户地址信息损坏。??核心教训??:

  1. 测试环境必须包含%中文%的边界测试用例
  2. 新旧系统对接时,使用Charset.defaultCharset()检测默认编码
  3. 在nginx层添加配置:proxy_set_header Accept-Charset "utf-8";

现在看到开发人员用记事本修改jsp文件时,我都会条件反射地检查文件编码格式。字符编码就像隐形的基础设施——平时感觉不到它的存在,但一旦出问题,整个系统都可能崩溃。最好的解决方式不是在出问题时补救,而是在项目启动时就建立编码规范文档。

本文由嘻道妙招独家原创,未经允许,严禁转载