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