Servlet-请求参数中文乱码解决方式
Servlet-请求参数中文乱码解决方式
乱码本质是“编码与解码字符集不一致”。常见场景是:浏览器用 UTF-8 编码发出请求,但服务端用 ISO-8859-1(或其它)去解码。
区分两条链路:
- 请求体(Body)解析:POST 表单/JSON 等,关键在
request.setCharacterEncoding - URL(QueryString)解析:GET 参数,关键在 Tomcat 连接器的 URI 解码配置
Post请求方式的解决方式
// 2. 解决乱码:POST. getReader()
request.setCharacterEncoding("UTF-8"); //设置字符输入流的编码
注意:必须在第一次读取参数/请求体之前调用。也就是在 getParameter*、getReader、getInputStream 之前设置。
GET请求方式的解决方式
原因是:编码为UTF-8, 解码为URL解码,编解码不一致。解码采用的是ISO-8859-1
URL编码
- 将字符串按照编码方式转为二进制
- 每个字节转为2个16进制数并在前边加上%
解决方式:
// 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。
更工程化的做法
- 统一在 Filter 层做编码处理:把
request.setCharacterEncoding("UTF-8")放在最前面的过滤器里,保证所有 Servlet 都受益(关联:Filter) - 旧版 Tomcat 的 GET 参数:通过连接器配置
URIEncoding="UTF-8"统一解码规则(避免在业务代码里手工二次解码)
