Servlet-请求参数中文乱码解决方式

Servlet-请求参数中文乱码解决方式

乱码本质是“编码与解码字符集不一致”。常见场景是:浏览器用 UTF-8 编码发出请求,但服务端用 ISO-8859-1(或其它)去解码。

区分两条链路:

Post请求方式的解决方式

 // 2. 解决乱码:POST. getReader()
        request.setCharacterEncoding("UTF-8");  //设置字符输入流的编码

注意:必须在第一次读取参数/请求体之前调用。也就是在 getParameter*getReadergetInputStream 之前设置。

GET请求方式的解决方式

原因是:编码为UTF-8, 解码为URL解码,编解码不一致。解码采用的是ISO-8859-1

URL编码

解决方式:

 // 2. 获取username
String username = request.getParameter("username");
System.out.println("解决乱码前:" + username);


// 3. GET,获取参数的方式:getQueryString
// 乱码原因:tomcat进行URL解码,默认的字符集ISO-8859-1
// 3.1 先对乱码数据进行编码:转为字节数组
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
// 3.2 字节数组解码
username = new String(bytes, StandardCharsets.UTF_8);
System.out.println("解决乱码后:" + username);

Tomcat8.0之后,已经解决了GET请求乱码问题,将默认的解码方式设置为UTF-8。

更工程化的做法

  1. 统一在 Filter 层做编码处理:把 request.setCharacterEncoding("UTF-8") 放在最前面的过滤器里,保证所有 Servlet 都受益(关联:Filter
  2. 旧版 Tomcat 的 GET 参数:通过连接器配置 URIEncoding="UTF-8" 统一解码规则(避免在业务代码里手工二次解码)

关联:Servlet-获取请求参数 / HTTP请求报文 / Request & Response