JavaWeb编码之get方式中文乱码问题

参考自《深入分析Java Web技术内幕》 许令波 著

一、现象描述

以get方式提交含中文表单,后台接收为乱码:

<form action="admin/User/searchUser.do" method="get">
    <div class="input-group">
       <input type="text" class="form-control" name="content" value="${content}" placeholder="Search for..." required>
       <span class="input-group-btn">
           <button class="btn btn-default" type="submit">搜索</button>
       </span>
   </div>
</form>

访问地址为:

后台输出为:
JavaWeb编码之get方式中文乱码问题_第1张图片

二、现象分析

URL 的组成部分如下:
JavaWeb编码之get方式中文乱码问题_第2张图片

请求的地址为:
JavaWeb编码之get方式中文乱码问题_第3张图片

从Request URL 可以看出 QueryString 编码是GBK。

以 GET 方式 HTTP 请求的 QueryString 和以 POST 方式 HTTP 请求的表单参数都是作为 Parameters 保存的,都通过 request.getParameter 获取参数值。

对它们的解码是在 request.getParameter 第一次被调用时进行的。
request.getParameter 方法被调用时将会调用 org.apache.catalina.connector.Request 的 parseParameters 方法。这个方法会对 GET 和 POST 方式传递的参数进行解码,但是他们解码的字符集可能不一样。

而QueryString编码采取的字符集要么是 Header 中 ContentType 定义的Charset,要么是默认的 ISO-8859-1 编码。

由此得出结论:中文经过GBK编码后,在服务端经过 ISO-8859-1解码,导致乱码。

三、解决方式

  1. 配置Tomcat的 server.xml 文件中的 connector 的 URIEncoding 和 useBodyEncodingForURI 属性(useBodyEncodingForURI = “true” 表示使用 ContentType 定义的编码,而且此处的 URI 仅仅是对 QueryString 使用 BodyEncoding 解码);
  2. 使用 new String(str.getBytes(“ISO-8859-1”), “UTF-8”) 解码;

验证如下:
方式1:
JavaWeb编码之get方式中文乱码问题_第4张图片

结果为:
JavaWeb编码之get方式中文乱码问题_第5张图片

使用 UTF-8 解码则中文正确传递。

方式2:

@RequestMapping(value = "/searchUser")
public String searchUser(String content) {
    System.out.println("content: " + content);
    try {
        content = new String(content.getBytes("ISO-8859-1"), "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    System.out.println("content after decode: " + content);
}

结果为:

你可能感兴趣的:(java,Web,编码)