使用tomcat时http请求中文乱码简单总结

994 阅读1分钟

现象

当浏览器使用get方式发送http请求时(如URL传值),如果出现中文,会出现乱码。

取得结果如下图:

分析(开发调试环境下,以tomcat容器为例)

tomcat解析URL时,默认使用ISO-8859-1编码,而通过URL中的中文会被浏览器使用UTF-8编码,此时前端与后端编码不一致,造成乱码

解决方法

  1. 主动转换编码
String name = req.getParameter("name");
String name2 = new String(name.getBytes("ISO-8859-1"), "UTF-8");
System.out.println(name);
System.out.println(name2);

结果如下:

2. 设置tomcat的URIEncoding属性

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

后端代码同上,此时结果如下:

发现不用转换编码就可以正确获取中文了

setCharacterEncoding方法

  1. setCharacterEncoding方法对get请求无效,将URIEncoding属性删除,重新测试:
req.setCharacterEncoding("UTF-8");
String name3 = req.getParameter("name");

System.out.println(name3);

2. setCharacterEncoding方法对post请求有效
编写html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试1</title>
</head>
<body>
	<form action="/test1" method="post" id="f1">
		<input name="name" value="小灰灰">
	</form>

	<script type="text/javascript">
		document.forms["f1"].submit();
	</script>
</body>
</html>

后端代码同上,此时结果如下:

3. setCharacterEncoding必须在使用getParameter方法之前,否则无效

String name = req.getParameter("name");
String name2 = new String(name.getBytes("ISO-8859-1"), "UTF-8");

req.setCharacterEncoding("UTF-8");
String name3 = req.getParameter("name");

System.out.println(name);
System.out.println(name2);
System.out.println(name3);