Java EE get请求、Post请求中文乱码解决

一、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的格式进行解码,因此无需显示指定转换方式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章