一、post请求中文乱码解决
首先,通过一个直观的程序展示我们的一个post请求乱码的demo
我们建立一个 Java EE项目charset_test,在WebContent目录建立一个html页面charset_form.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"> <!-- 指定浏览器在显示的时候默认使用utf-8编码 -->
<title>Insert title here</title>
</head>
<body>
<form action="/charset_test/charset/process" method="get">
姓名:<input type="text" name="ename"><br>
地址:<input type="text" name="eaddress"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
在Java Resources/src目录下建立servlet:CharsetServlet指定包com.servlet.charset
package com.servlet.charset;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/charset/process")
public class CharsetServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public CharsetServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String ename = request.getParameter("ename");
String eaddress = request.getParameter("eaddress");
System.out.println(ename + ":" + eaddress);
}
}
启动服务,我们在前台form表单填写中文,提交表单,查看后台打印字符~。
后台打印结果:
一堆乱码,why?
首先,我先来说解决方法,我这有两种方法,先说第一种:
在现有的CharsetServlet中,我将获取到的ename及eaddress做以下处理,原因我直接在代码中通过注释写出来。
String ename = request.getParameter("ename");
String eaddress = request.getParameter("eaddress");
//将ename字符串通过iso-8859-1编码转换为字节数组,再通过utf-8编码,将字节数组解码形成新的字符串
/*
1、为什么是iso-8859-1?因为这是tomcat默认的解码方式,将浏览器传递过来的参数默认通过iso-8859-1来解码。这里通过ename.getBytes("iso-8859-1") 获取到的字节数组就是最原始的从浏览器端传递过来的字节数组
2、将通过getBytes函数得到的新的字节数组,通过指定的UTF-8编码解码形成新的字符串。
那这里为什么是utf-8呢?这里的话,就要看我们编写的那个html页面的一句代码了:
<meta charset="utf-8">
这一句是告诉浏览器的编码方式,浏览器将按照utf-8编码来对我们的html页面进行解析
所以我们的post请求,就是将我们的请求体通过utf-8编码传递到我们的后台web服务器的(这里我是这么理解的,因为如果我把chaset="utf-8"修改为gbk-2312,那么后台的utf-8解码参数也要修改为gbk-2312,所以我个人认为这中间是这么转换的,如果大家有什么不同的意见,可以指正。)
3、通过指定解码形成的字符串(这里是utf-8),在Java中String又是怎么保存的呢?在这里我觉得我们的Java做了两步转换,一是将具体字节通过utf-8编码进行解码为字符,再将这个字符编码为“系统编码”
因为这里我也不是很确定这是否是系统编码,不过肯定有一个这样的编码,我们就先这么认为~~以帮助我们理解。
*/
String utf8Ename = new String(ename.getBytes("iso-8859-1"),"UTF-8");
String utf8Eaddress = new String(eaddress.getBytes("iso-8859-1"),"UTF-8");
System.out.println(ename + ":" + eaddress);
对于上面的方法,可以解决我们的乱码问题,不过,如果参数很多的情况下,我们仍然要这么做吗?岂不是显得很麻烦?
这里,我们可以在原来的代码基础上做这样的修改:
//这样设置之后,我们通过request获取前台post传递的参数值,默认就采用utf-8进行解码操作了。
request.setCharacterEncoding("UTF-8");
String ename = request.getParameter("ename");
String eaddress = request.getParameter("eaddress");
System.out.println(ename + ":" + eaddress);
注意:request.setCharacterEncoding("UTF-8");必须在post程序处理使用request获取参数之前使用,且只对于post请求传递的参数起作用,get方式是无效的。
二、get请求中文乱码解决
编码解码的原理上面已经说了,这里直接写怎么操作吧。
1、编辑打开tomcat的配置文件server.xml:D:\download\java\apache-tomcat-8.5.43\conf\server.xml
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
修改为
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
即可。
tips:对于Tomcat8.x以后版本,默认get请求发送中文,默认就是通过utf-8的格式进行解码,因此无需显示指定转换方式