一. 创建一个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。

解决POST请求中文乱码
本文通过两个实验展示了如何在不同编码的HTML文件中发送POST请求,并遇到中文乱码问题。通过对请求体设置正确的编码方式,成功解决了乱码问题。
1086

被折叠的 条评论
为什么被折叠?



