servlet请求乱码问题

有时候在servlet中接收到的数据会出现乱码问题。

乱码的产生原因

当用户通过浏览器提交一个包含 UTF-8 编码格式的两个中文请求时,浏览器会将这两个中文字符变为六个字节(一般一个 UTF-8 汉字占用三个字节),即形成六个类似%8E 的字节表示形式,并将这六个字节上传至 Tomcat 服务器。
Tomcat 服务器在接收到这六个字节后,并不知道它们原始采用的是什么字符编码。而Tomcat 默认的编码格式为 ISO-8859-1。所以会将这六个字节按照 ISO-8859-1 的格式进行解码,解码后在控制台显示,所以在控制台会显示乱码。

乱码的解决方案

针对 POST 提交乱码的解决方式
在接收请求参数之前先通过 request 的 setCharacterEncoding()方法,指定请求体的字符编码格式。这样的话,在接收到请求中的参数后,就可按照指定的字符编码进行解码。
注意,request 的 setCharacterEncoding()方法只能解决 POST 提交方式中的乱码问题,对
于 GET 提交方式的不起作用。因为该方法设置的是请求体中的字符编码, GET 提交中的参数不出现在请求体中,而出现在请求行。

    //设置post请求的字符编码
    request.setCharacterEncoding("utf-8");

    //根据html中的name的名字获取用户在input中填写的值
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    //获取用户勾选的checkbox的值
    String[] hobby = request.getParameterValues("hobby");

    System.out.println(username);
    System.out.println(password);
    for(String s:hobby){
        System.out.println(s);
    }

针对get提交乱码的解决方式

可以通过修改 Tomcat 默认字符编码的方式来解决 GET 提交方式中携带中文的乱码问题。在 Tomcat 安装目录的 conf/server.xml 中,找到端口号为 8080 的标签,在其中添加 URIEncoding=”UTF-8″的设置,即可将 Tomcat 默认字符编码修改为 UTF-8。

 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

需要注意的是在修改时要找到正确的server.xml文件。

IDEA中在启动tomcat的时候,控制台的最上面有一项是Using CATALINA_BASE,这个后面是一个文件路径,进入后,打开里面的conf文件夹,修改这里的server.xml即可。
eclipse中双击tomcat服务器,如下图:

设置tomcat的路径

上图中有三个选项,不同的选项表示使用的不同路径下的tomcat

  1. 表示使用eclipse工作空间的tomcat,该路径在工作空间目录中的.metadata.plugins\org.eclipse.wst.server.core\tmp0目录中,如果你使用的是这个(eclipse会默认使用这个),需要修改该目录中的server.xml才会生效。
  2. 表示使用我单独下载的tomcat所在的路径,我本机的是在:F:\monkey1024\apache-tomcat-9.0.0.M26中,如果你使用的是这个,需要修改该目录中的server.xml文件。
  3. 表示自定义一个位置,即手动指定web应用运行的目录位置,如果你使用的是这个,需要修改该目录中的server.xml文件。

万能解决方案

//根据html中的name的名字获取用户在input中填写的值
String username = request.getParameter("username");
//将数据按照ISO8859-1编码后放到字节数组中
byte[] bytes = username.getBytes("ISO8859-1");
//将字节数组按照UTF-8解码为字符串
username = new String(bytes,"UTF-8");

先以 ISO8859-1 的形式先对单字节的数据进行编码,并将编码后的数据存放在字节数组中。然
后,再将字节数组中的数据,按照指定的 UTF-8 格式进行解码,即变为了需要的 UTF-8 字符
编码的数据,解决了中文乱码问题。
通过上面的代码就可以解决get和post的乱码问题,但是代码量较大,开发中使用较少。