【计算机网络】《HTTP协议方法GET和POST的比较》

题目:《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)]

3.1.1发送请求之前,浏览器的状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z9b1L7dg-1664364310885)(imgs/Pasted%20image%2020220926213905.png)]

3.1.2发送请求之前,浏览器开发者工具的状态

发送请求之后
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2bqTOHmo-1664364310886)(imgs/Pasted%20image%2020220926213943.png)]

3.1.3发送请求之后,浏览器的状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i4oysmCC-1664364310887)(imgs/Pasted%20image%2020220926214016.png)]

3.1.4发送请求之前,浏览器开发者工具的状态

控制台打印
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)]

3.2.1发送请求之后,浏览器的状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-epavFg82-1664364310889)(imgs/Pasted%20image%2020220926215127.png)]

3.2.2发送请求之后,浏览器的状态

发送请求之后

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GdWId5dF-1664364310891)(imgs/Pasted%20image%2020220926215226.png)]

3.2.3发送请求之后,浏览器的状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2eyIhEhy-1664364310892)(imgs/Pasted%20image%2020220926215241.png)]

3.2.4发送请求之后,浏览器的状态

后台打印张三 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值