题目:《HTTP协议方法GET和POST的比较》 | 姓名:高德博 | 日期:2022.9.28 |
---|
实验环境:
- JDK1.8
- IDEA2021
- Edge浏览器
目录
1.认识HTTP
HTTP协议(Hypertext Transfer Protocol)是超文本传输协议的简称,是应用层一个基于请求/响应的模式的无状态协议
目前,HTTP常用的版本是1.1
相比于1.0版本,1.1实现了长连接——浏览器可以连续发送多次请求,不必等待每次响应之后再请求
2.报文
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iwlXr14o-1664364310882)(imgs/Pasted%20image%2020220926211738.png)]
-
报文首部
-
行
-
请求行
Method Request-URI HTTP-Version CRLF
请求行以一个CRLF结束 -
响应行
-
-
首部字段
- 通用首部字段
- 请求首部字段
- 响应首部字段
- 实体首部字段
-
-
空行
CRLF用于分隔报文首部和报文主体(两个,第一个表示首部字段结束,第二个代表空行)
- CR = Carriage Return,回车符号(
\r
,十六进制 ascii 码为0x0D
,十进制 ascii 码为 13),用于将鼠标移动到行首,并不前进至下一行。- LF = Line Feed,换行符号(
\n
, 十六进制 ascii 码为0x0A
,十进制 ascii 码为 10)。不同的操作系统对于换行不同
- Windows 操作系统默认的文本换行符为 CRLF;
- Linux 系统默认使用 LF,
- macOS 系统默认使用 LF,早期的 mac os 系统使用 CR 换行
- 报文主体
3.请求方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cqki7q5z-1664364310883)(imgs/Pasted%20image%2020220926211105.png)]
其中常用的请求方法有GET,POST
3.1 GET
- get提交的数据会放在url之后,以
?
分割URL和数据传输,参数之间以&
相连 - get方式明文传递,数据量小,不安全
- 效率高,浏览器默认请求方式为GET请求
- 对应的Servlet方法是doGet
我们定义一个注册页面的表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="/servletProject/register" method="get">
用户名:<input type="text" name="username"> <br>
密码:<input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
再编写一个servlet
@WebServlet(value="/register")
public class RegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取姓名
String name=req.getParameter("username");
//获取密码
String password=req.getParameter("password");
System.out.println(name+" 的密码 "+password);
}
}
发送get请求之前
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DJDHUTgJ-1664364310884)(imgs/Pasted%20image%2020220926213758.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z9b1L7dg-1664364310885)(imgs/Pasted%20image%2020220926213905.png)]
发送请求之后
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2bqTOHmo-1664364310886)(imgs/Pasted%20image%2020220926213943.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i4oysmCC-1664364310887)(imgs/Pasted%20image%2020220926214016.png)]
控制台打印
gao 的密码 123
从图中3.1.3我们可以看到传输的数据是以明文的形式传递
localhost:8080/servletProject/register?username=gao&password=123
3.2 POST
- post方法是把提交的数据放在HTTP报文的主体中
- 密文传递数据,数据量大,安全
- 效率相对应没有get高
- 对应的servlet方法是doPost
我们把注册的方法改为post
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="/servletProject/register" method="post">
用户名:<input type="text" name="username"> <br>
密码:<input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
现在我们在servlet的后端中添加doPost的方法
@WebServlet(value="/register")
public class RegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取姓名
String name=req.getParameter("username");
//获取密码
String password=req.getParameter("password");
System.out.println(name+" 的密码 "+password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.doPost(req, resp);
//设置统一的编码
req.setCharacterEncoding("utf-8");
//获取姓名
String name=req.getParameter("username");
//获取密码
String password=req.getParameter("password");
System.out.println(name+" post的密码 "+password);
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJ9pvalA-1664364310888)(imgs/Pasted%20image%2020220926215109.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-epavFg82-1664364310889)(imgs/Pasted%20image%2020220926215127.png)]
发送请求之后
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GdWId5dF-1664364310891)(imgs/Pasted%20image%2020220926215226.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2eyIhEhy-1664364310892)(imgs/Pasted%20image%2020220926215241.png)]
后台打印张三 post的密码 123
3.2.1 Get和Post的比较
- GET在浏览器回退时是无害的,而POST会再次提交请求。
- GET产生的URL地址可以被收藏为书签,而POST不可以。
- GET请求会被浏览器主动缓存,而POST不会,除非手动设置。
- GET请求只能进行url(appliacation-x-www-form-urlencoded)编码,而POST支持多种编码方式(multipart/form-data)。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- GET请求在URL中传送的参数是有长度限制的,而POST没有。
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET参数通过URL传递,POST放在Request body中
POST 方法比 GET 方法安全?
按照网上大部分文章的解释,POST 比 GET 安全,因为数据在地址栏上不可见。
然而从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输,只要在网络节点上抓包,就能完整地获取数据报文。
要想安全传输,就只有加密,也就是 HTTPS
3.3 HEAD
HEAD方法跟GET方法相同,只不过服务器响应时不会返回消息体。
一个HEAD请求的响应中,HTTP头中包含的元信息应该和一个GET请求的响应消息相同。这种方法可以用来获取请求中隐含的元信息,而不用传输实体本身。
适用于
1.检查资源的有效性。
2.检查超链接的有效性。
3.检查网页是否被串改。
4.多用于自动搜索机器人获取网页的标志信息,获取rss种子信息,或者传递安全认证信息等。
在servlet中添加doHead方法
@Override
protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String headerAcceptLanguage = req.getHeader("Accept-Language");
System.out.println(headerAcceptLanguage);
}
使用PostMan进行测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lIPttzo5-1664364310893)(imgs/Pasted%20image%2020220926222153.png)]
后台输出为
zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6