010_Post请求中文乱码

一. 创建一个GBK编码的html文件, 发送post请求

1. 新建一个PostLuanMa的Web工程

2. 新建一个postGBK.html文件

3. 更改postGBK.html编码为GBK

4. 编写postGBK.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="GBK" />
		<title>Post请求中午乱码处理</title>
	</head>
	<body>
		<form action="PGBKLM.action" method="post">
			用户名:<input type="text" name="username" /><br />
			密码:<input type="password" name="password" /><br /> 
			 	<input type="submit" value="登录">
		</form>
	</body>
</html>

5. 新建一个PostGBKLuanMa.java类

6. 编写PostGBKLuanMa.java类

package com.lywgames.myservlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PostGBKLuanMa extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		
		System.out.println("username = " + username + " password = " + password);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

7. 编写web.xml

8. 部署运行, 访问postGBK.html

9. Ctrl+Shift+I打开Chrome浏览器的开发者工具, 点击登录按钮, 控制台打印

10. 观察Chrome浏览器的开发者工具中的数据

11. post请求在提交数据的时候, 我们的中文用户名"的的确确"经过了一次GBK的编码变成了%B5%C4%B5%C4%C8%B7%C8%B7。我们的PostGBKLuanMa在接受到%B5%C4%B5%C4%C8%B7%C8%B7数据之后经过了一次ISO-8859-1的解码, 数据变成了µÄµÄÈ·È·。

二. 创建一个UTF-8编码的html文件, 发送post请求

1. 新建一个postGBK.html文件

2. 编写postUTF8.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>Post请求中午乱码处理</title>
	</head>
	<body>
		<form action="PUTF8LM.action" method="post">
			用户名:<input type="text" name="username" /><br />
			密码:<input type="password" name="password" /><br /> 
			 	<input type="submit" value="登录">
		</form>
	</body>
</html>

3. 新建一个PostUTF8LuanMa.java类

4. 编写PostUTF8LuanMa.java类

package com.lywgames.myservlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PostUTF8LuanMa extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		
		System.out.println("username = " + username + " password = " + password);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

5. 编写web.xml

6. 部署运行, 访问postUTF8.html

7. Ctrl+Shift+I打开Chrome浏览器的开发者工具, 点击登录按钮, 控制台打印

8. 观察Chrome浏览器的开发者工具中的数据

9. post请求在提交数据的时候, 我们的中文用户名"的的确确"经过了一次GUTF-8的编码变成了%E7%9A%84%E7%9A%84%E7%A1%AE%E7%A1%AE。我们的PostUTF8LuanMa在接受到%E7%9A%84%E7%9A%84%E7%A1%AE%E7%A1%AE数据之后经过了一次ISO-8859-1的解码, 数据变成了çç确确。

三. 解决post请求的乱码

1. 经过上面2个实验, 我们的中文数据在请求的时候实际上是在请求体里经过了一次GBK或者UTF-8编码, 然后把数据提交给了Servlet, 然而Servlet在获取数据时是进行了一次ISO-8859-1的解码, 所以发生了乱码。因此, 我们需要在Servlet里面在获取数据之前, 设置数据解码所使用的码表。

2. 使用HttpServletRequest的setCharacterEncoding方法设置请求体的编码方式, 需要在获取数据之前进行设置, 在获取数据的时候就会按照指定的编码方式进行解码, 不在使用默认的ISO-8859-1的解码。

3. 在PostGBKLuanMa.java里设置请求体的编码为GBK。

4. 在PostUTF8LuanMa.java里设置请求体的编码为UTF-8。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值