网络原理 - HTTP/HTTPS

1. HTTP

1.1 HTTP是什么?

HTTP (全称为 “超文本传输协议”) 是⼀种应用非常广泛的应用层协议.

HTTP发展史: HTTP 诞生于1991年. 目前已经发展为最主流使用的⼀种应用层协议
在这里插入图片描述
最新的 HTTP 3 版本也正在完善中, 目前 Google / Facebook 等公司的产品已经支持了. HTTP 往往是基于传输层的TCP 协议实现的.
(HTTP1.0, HTTP1.1, HTTP2.0 均为TCP, HTTP3 基于UDP 实现)
目前我们主要使用的还是 HTTP1.1 和 HTTP2.0

我们平时打开一个网站, 就是通过HTTP协议来传输数据的,例如:

在这里插入图片描述

当我们在浏览器中输入⼀个百度搜索的 “网址” (URL) 时, 浏览器就给百度的服务器发送了⼀个 HTTP请求, 百度的服务器返回了⼀个 HTTP 响应.
这个响应结果被浏览器解析之后, 就展示成我们看到的页面内容. (这个过程中浏览器可能会给服务器发 送多个 HTTP 请求, 服务器会对应返回多个响应, 这些响应里就包含了页面的HTML, CSS, JavaScript, 图片, 字体等信息).
所谓 “超文本” 的含义, 就是传输的内容不仅仅是文本(比如 HTML, CSS 这个就是文本), 还可以是⼀些其他的资源, 比如图片, 视频, 音频等二进制的数据.

1.2 应用层协议

前文我们已经了解到TCP/IP , 已经知道目前数据能从客户端进程经过路径选择跨网络传送到服务器端进程[ IP+Port ].
可是,仅仅把数据从A点传送到B点就完了吗?

这就好比,在淘宝上买了⼀部洗衣机,卖家[ 客户端 ]把洗衣机通过顺丰[ 传送+路径选择 ] 送到买家 [ 服务器 ] 手里就完了吗?
当然不是,买家还要使用这款产品,还要在使用之后,给卖家打分评论。

所以,我们把数据从A端传送到B端, TCP/IP 解决的是顺丰的功能,而两端还要对数据进行加工处理或者使用,所以我们还需要⼀层协议,不关心通信细节,关心应用细节!
这层协议叫做应用层协议。而应用是有不同的场景的,所以应用层协议是有不同种类的,其中经典协议之⼀的HTTP就是其中的佼佼者.

再回到我们刚刚说的买洗衣机的例子,顺丰相当于 TCP/IP 的功能,那么买回来的洗衣机都附带了说明书【产品介绍,使用介绍,注意事项等】,而该说明书指导用户该如何使用洗衣机,此时的说明书可以理解为用户层协议

1.3 HTTP 协议的工作过程

当我们在浏览器中输入⼀个 “网址”, 此时浏览器就会给对应的服务器发送⼀个 HTTP 请求. 对方服务器收到这个请求之后, 经过计算处理, 就会返回⼀个 HTTP 响应.

在这里插入图片描述

1.4 HTTP协议格式

HTTP 是⼀个文本格式的协议. 可以通过 Chrome 开发者工具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节

1.5 抓包工具Fiddler

1.5.1 抓包工具下载

抓包工具Fiddler下载链接

下载流程:

在这里插入图片描述
页面图:

在这里插入图片描述

如果电脑上抓不到HTTPS的数据包,要进行如下设置:

在这里插入图片描述

1.5.2 抓包工具的原理

Fiddler 相当于⼀个 “代理”.
浏览器访问 baidu.com 时, 就会把 HTTP 请求先发给 Fiddler, Fiddler 再把请求转发给 baidu 的服务器. 当 baidu 服务器返回数据时, Fiddler 拿到返回数据, 再把数据交给浏览器.
因此 Fiddler 对于浏览器和 baidu 服务器之间交互的数据细节, 都是非常清楚的

在这里插入图片描述

代理就可以简单理解为⼀个跑腿小弟. 你想买罐冰阔落, 又不想自己下楼去超市, 那么就可以把钱给你的跑腿小弟,跑腿小弟来到超市把钱给超市老板, 再把冰阔落拿回来交到你手上. 这个过程中, 这个跑腿小弟对于 “你” 和 “超市老板” 之间的交易细节,是非常清楚的.

1.5.3 抓包结果分析

以下是⼀个 HTTP请求/响应的抓包结果.
在这里插入图片描述

1.5.3.1 HTTP请求部分

在这里插入图片描述

说明:

  • 首行: [方法] + [url] + [版本]
  • Header: 请求的属性, 冒号分割的键值对,每组属性之间使⽤\n分隔,遇到空行表示Header部分结束
  • Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有⼀个Content-Length属性来标识Body的长度
1.5.3.2 HTTP响应部分

在这里插入图片描述

说明:

  • 首行: [版本号] + [状态码] + [状态码解释]
  • Header: 请求的属性,冒号分割的键值对,每组属性之间使用\n分隔,遇到空行表示Header部分结束
  • Body: 空行后面的内容都是Body.Body允许为空字符串. 如果Body存在,则在Header中会有⼀个Content-Length属性来标识Body的长度,如果服务器返回了⼀个html页面,那么html页面内容就是在body中
1.5.3.3 协议格式总结

在这里插入图片描述

为什么 HTTP 报文中要存在 “空行”?

因为 HTTP 协议并没有规定报头部分的键值对有多少个. 空⾏就相当于是 “报头的结束标记”, 或者是"报头和正文之间的分隔符".
HTTP在传输层依赖 TCP 协议, TCP 是面向字节流的. 如果没有这个空行, 就会出现 “粘包问题”.

1.6 HTTP 请求 (Request)

1.6.1 认识 URL

1.6.1.1 URL 基本格式

平时我们俗称的 “网址” 其实就是说的 URL (Uniform Resource Locator 统⼀资源定位符).
为网络上的资源(图片,视频,音乐…)定位
互联网上的每个文件都有⼀个唯⼀的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它.URL 的详细规则由因特网标准RFC1738进行了约定.

在这里插入图片描述

说明:

  • https : 协议方案名. 常见的有 http 和 https, 也有其他的类型. (例如访问mysql 时用到的jdbc:mysql)
  • localhost:服务器的域名或者IP地址
  • 端口号:当端口号省略的时候, 浏览器会根据协议类型自动决定使用哪个端口.例如 http 协议默认使用80端口,https协议默认使用443端口.
  • /app/user/: 虚拟目录
  • info.do : 文件名,访问的是服务器上的哪个具体的资源
  • 查询参数(字符串)(query string). 本质是一个键值对结构. 键值对之 间使用&分隔. 键和值之间使用 = 分隔.
  • 锚: 片段标识符,用于定位页面具体位置的资源
1.6.1.2 使用ping 命令查看域名对应的 IP 地址

例如:以我当前页面的网址为例
在这里插入图片描述

使用该命令查看:ping editor.csdn.net
在这里插入图片描述

注意1: 有的电脑上ping命令会报错ping不是内部或外部命令,也不是可运行的程序或批处理文件 .这种情况是因为有的 Windows10默认没有启用 ping 命令.百度搜索 windows10启用ping 即可
注意2: query string 中的内容是键值对结构. 其中的 key 和 value 的取值和个数, 完全都是程序猿自己约定的. 我们可以通过这样的方式来自定制传输我们需要的信息给服务器
注意3: URL 中的可省略部分

  • 协议名: 可以省略, 省略后默认为 http://
  • ip地址 / 域名: 在 HTML 中可以省略(比如 img, link, script, a 标签的 src 或者 href 属性). 省略后表示服务器的 ip / 域名与当前 HTML 所属的 ip / 域名⼀致.
  • 端口号: 可以省略. 省略后如果是 http 协议, 端口号自动设为 80, 如果是 https 协议, 端口号自动设为443.
  • 文件名: 可以省略. 省略后相当于 / . 有些服务器会在发现 / 路径的时候⾃动访问 /index.html
  • 查询参数(字符串): 可以省略
  • 锚: 可以省略

1.6.2 认识方法

方法描述
GET从服务器获取资源。用于请求数据而不对数据进行更改。例如,从服务器获取网页、图片等。
POST向服务器发送数据以创建新资源。常用于提交表单数据或上传文件。发送的数据包含在请求体中 。
PUT向服务器发送数据以更新现有资源。如果资源不存在,则创建新的资源。与 POST 不同,PUT 通常是幂等的,即多次执行相同的 PUT 请求不会产生不同的结果。
DELETE从服务器删除指定的资源。请求中包含要删除的资源标识符。
PATCH对资源进行部分修改。与 PUT 类似,但 PATCH 只更改部分数据而不是替换整个资源。
HEAD类似于 GET,但服务器只返回响应的头部,不返回实际数据。用于检查资源的元数据(例如,检查资源是否存在,查看响应的头部信息)。
OPTIONS返回服务器支持的 HTTP 方法。用于检查服务器支持哪些请求方法,通常用于跨域资源共享(CORS)的预检请求。
TRACE回显服务器收到的请求,主要用于诊断。客户端可以查看请求在服务器中的处理路径。
CONNECT建立一个到服务器的隧道,通常用于 HTTPS 连接。客户端可以通过该隧道发送加密的数据。

如何指定请求的方法?
1.当在浏览器的地址栏中输入一个URL时并发起访问时,发送的全是GET请求
2.通过代码发送请求,可以指定GET POST PUT DELETE
3.通过HTML中的表单来指定方法名 要提交的数据可以填在表单中
4.网站加载所需要的一些资源都是用GET方法,比如网站中的图片,样式,字体…

1.6.2.1 GET方法

GET是最常用的HTTP方法.常用于获取服务器上的某个资源.在浏览器中直接输入URL,此时浏览器就会发送出⼀个GET请求.另外,HTML中的link,img,script等标签,也会触发GET请求.

我们使用Fiddler观察GET请求
打开Fiddler,访问百度主页,观察抓包结果
在这里插入图片描述
在上面的结果中可以看到:
蓝色选中的
在这里插入图片描述
是通过浏览器地址栏发送的GET请求.
下面的和百度域名相关的请求,有些是通过html中的link/script/img标签产生的,例如
在这里插入图片描述

1.6.2.2 POST方法

POST方法也是⼀种常见的方法.多用于提交用户输入的数据给服务器(例如登陆页面).
通过HTML中的form标签可以构造POST请求,或者使用JavaScript的ajax也可以构造POST请求.

比如:在QQ的登陆页面,输入账号,密码,验证码之后,点击登陆,就可以看到POST请求.
在这里插入图片描述
在这里插入图片描述

点击这个请求,查看请求详情

POST https://login.live.com/RST2.srf HTTP/1.0
Connection: Keep-Alive
Content-Type: application/soap+xml
Accept: */*
User-Agent: MSAWindows/55 (OS 10.0.26100.0.0 ge_release; IDK 10.0.26100.1150 ge_release; Cfg 16.000.29325.00; Test 0)
Content-Length: 6689
Host: login.live.com<?xml version="1.0" encoding="UTF-8"?><s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:ps="http://schemas.microsoft.com/Passport/SoapServices/PPCRL" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wssc="http://schemas.xmlsoap.org/ws/2005/02/sc" xmlns:wst="http://schemas.xmlsoap.org/ws/2005/02/trust"><s:Header><wsa:Action s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue</wsa:Action><wsa:To s:mustUnderstand="1">https://login.live.com:443/RST2.srf</wsa:To><wsa:MessageID>1743868954</wsa:MessageID><ps:AuthInfo xmlns:ps="http://schemas.microsoft.com/Passport/SoapServices/PPCRL" Id="PPAuthInfo"><ps:HostingApp>{83928489-55ae-4c23-94ec-03a106b80ba2}</ps:HostingApp><ps:BinaryVersion>55</ps:BinaryVersion><ps:UIVersion>1</ps:UIVersion><ps:InlineUX>Silent</ps:InlineUX><ps:IsConnected>1</ps:IsConnected><ps:IsAdmin>1</ps:IsAdmin><ps:PackageSID>S-1-15-2-350187224-1905355452-1037786396-3028148496-2624191407-3283318427-1255436723</ps:PackageSID><ps:Cookies></ps:Cookies><ps:RequestParams>AQAAAAIAAABsYwQAAAAyMDUy</ps:RequestParams><ps:WindowsClientString>+g8XZ28fqvzp//Kxlhb+gky7PaVY6+Z9xwWf1jQtIks=</ps:WindowsClientString><ps:ClientCapabilities>1</ps:ClientCapabilities></ps:AuthInfo><wsse:Security><EncryptedData xmlns="http://www.w3.org/2001/04/xmlenc#" Id="BinaryDAToken1" Type="http://www.w3.org/2001/04/xmlenc#Element"><EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc"></EncryptionMethod><ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:KeyName>http://Passport.NET/STS</ds:KeyName></ds:KeyInfo><CipherData><CipherValue>M.C532_SN1.0.U.Cjxq7Zf9oe/by0KFX7UvrH/mNiZA3rpIgRyiTfu/lzLaLY33hT1uYBDrljhJddWRzvj9tywgIO6trP+KGqgzc1KYdU+IuAgKLdLhox/398bLtO+5f/XRcEEwokgMGAZVkBNBsY21PZ4J0pUXsSPhoVgZbmK2GQfXUIJ3/mrESGHKAHIr5mJF5Bg+lKoriNIic+DfZcZoDo1JiJ94GOvczy4muT49osAnT/HrNHMewmSoAqm5c0HIiwNiAoPGybaU0JwU5CcUjnBM2OFJblb6I/hG3HP0UFBpKbdSeXpSnBDKBHyu13ZRkGIq8mBMaLJlOf26C/Fju8QDWN44qDxuhj8d2ymDv3SQY0ctG4ecLD4/26Zhm0VoqNDXoeuUwyjXTsblnh/pnrDdNQNumjNeYK0SKabEzd9xZ/gpQ1A9QoyDAQj+AMlpplIGT/9+I8AQhqXIo2vpxrNRyfjY2DGmUVvmrmDCO67OCaAUQ88sHMgzBV2xXR5iE1xBcEKVyOeGt8C/CWxU8N8UnnZcWnA84bc=</CipherValue></CipherData></EncryptedData><wsse:BinarySecurityToken ValueType="urn:liveid:device" id="DeviceDAToken">&lt;EncryptedData xmlns=&quot;http://www.w3.org/2001/04/xmlenc#&quot; Id=&quot;devicesoftware&quot; Type=&quot;http://www.w3.org/2001/04/xmlenc#Element&quot;&gt;&lt;EncryptionMethod Algorithm=&quot;http://www.w3.org/2001/04/xmlenc#tripledes-cbc&quot;&gt;&lt;/EncryptionMethod&gt;&lt;ds:KeyInfo xmlns:ds=&quot;http://www.w3.org/2000/09/xmldsig#&quot;&gt;&lt;ds:KeyName&gt;http://Passport.NET/STS&lt;/ds:KeyName&gt;&lt;/ds:KeyInfo&gt;&lt;CipherData&gt;&lt;CipherValue&gt;M.C522_SN1.0.D.Cp6GgsxybbCn5NIcYEeXdlTK+D6zwZip99XCUv2IuNO5JdOYQ9Qbdhl46nbeGNA41Istb7j9ukFB5gb4JZwyQ1N/JyPnbkQLjjbuA+w1rZuqmRuT/0nMgF4zqdvJh70q0vzS9Xn2pRAxXb+YxwbAg5cUsmNp7p0thbR6aIqR3cZZdSxk9QOuLyLyyO0Iuf/Ag6zuWgYHe8GzLgQ6+97cnjxAdjrw1Bm9JzjGyAXQqm65VLFzRLu48hcpcj3L2dt46NgQWc0+o5wtBY/iT5XdoB9xpL0UVW3cTTC7a8DbdPyE/KygIqZ42q2Ak0vXDR2egW2XRfK3RpTiRhUaOdhitirqneNBFLD0wjPb04HdRINLCGo7XruZeocWdnFMEz8LWEUyiBca8VM9WYxRfo3z8PhOGWu60ZzezhVZVB32mMZRkkkQecFHVz5lVq5Yq074s9zOvurxQglK8LBGu/cMbXFS+2tr3RO8asJE+EZSFf7j1E4Zz4hjOVKFIz5e720u0vqPBY6GvYmupLoIYyHbZGEdnru/4v8+ledOTxWggS/1&lt;/CipherValue&gt;&lt;/CipherData&gt;&lt;/EncryptedData&gt;</wsse:BinarySecurityToken><wsse:UsernameToken wsu:Id="user"><wsse:UsernameHint>l3143159923@outlook.com</wsse:UsernameHint><wsse:LoginOption>1</wsse:LoginOption></wsse:UsernameToken><wssc:DerivedKeyToken wsu:Id="SignKey" Algorithm="urn:liveid:SP800108_CTR_HMAC_SHA256_DOUBLEDERIVED"><wsse:RequestedTokenReference><wsse:KeyIdentifier ValueType="http://docs.oasis-open.org/wss/2004/XX/oasis-2004XX-wss-saml-token-profile-1.0#SAMLAssertionID"/><wsse:Reference URI="#DeviceDAToken"/></wsse:RequestedTokenReference><wssc:Nonce>/UA/GlIRTmlg4ZPUUMPWz43D61ym3MAK</wssc:Nonce></wssc:DerivedKeyToken><wsu:Timestamp wsu:Id="Timestamp"><wsu:Created>2025-04-05T16:02:32Z</wsu:Created><wsu:Expires>2025-04-05T16:07:32Z</wsu:Expires></wsu:Timestamp><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#hmac-sha256"></SignatureMethod><Reference URI="#RSTS"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></DigestMethod><DigestValue>5NRERwlJe9qrAHDyJmZGu3kz6JACRrEp1r8mMxv72J4=</DigestValue></Reference><Reference URI="#Timestamp"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></DigestMethod><DigestValue>cggLyIZMXGOoSoHS5OgZqBIkj8HoitpiwNoMKT3gJMI=</DigestValue></Reference><Reference URI="#PPAuthInfo"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></DigestMethod><DigestValue>irEWjs2gYzGg/WnXhGLcO938EP5QFb0lswvpHgVzodU=</DigestValue></Reference></SignedInfo><SignatureValue>zauBSluyVFh/Yuw9m6R7CA3kgtEfDjK2vI3mHOjU3Do=</SignatureValue><KeyInfo><wsse:SecurityTokenReference><wsse:Reference URI="#SignKey"/></wsse:SecurityTokenReference></KeyInfo></Signature></wsse:Security></s:Header><s:Body><ps:RequestMultipleSecurityTokens xmlns:ps="http://schemas.microsoft.com/Passport/SoapServices/PPCRL" Id="RSTS"><wst:RequestSecurityToken Id="RST0"><wst:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</wst:RequestType><wsp:AppliesTo><wsa:EndpointReference><wsa:Address>scope=service::https://mucp.api.account.microsoft.com::MBI_SSL&amp;uaid=65309187-1129-4074-A0B4-11DB8EC4A1BC&amp;ssoappgroup=windows</wsa:Address></wsa:EndpointReference></wsp:AppliesTo><wsp:PolicyReference URI="TOKEN_BROKER"></wsp:PolicyReference></wst:RequestSecurityToken><wst:RequestSecurityToken Id="RST1"><wst:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</wst:RequestType><wsp:AppliesTo><wsa:EndpointReference><wsa:Address>http://Passport.NET/tb</wsa:Address></wsa:EndpointReference></wsp:AppliesTo></wst:RequestSecurityToken></ps:RequestMultipleSecurityTokens></s:Body></s:Envelope>

POST请求的特点:

  • 首行的第⼀部分为POST
  • URL的query string一般为空(也可以不为空)
  • header部分有若干个键值对结构.
  • body部分⼀般不为空.body内的数据格式通过header中Content-Type指定
  • body的长度由header中Content-Length指定

GET和POST的区别??

  • 语义不同:GET⼀般用于获取数据,POST⼀般用于提交数据.
  • GET的body一般为空,需要传递的数据通过query string传递,POST的query string⼀般为空,需要传递的数据通过body传递
  • GET请求一般是幂等 (每次访问同一个URL,得到的结果都相同) 的,POST请求一般是不幂等的.(如果多次请求得到的结果⼀样,就视为请求是幂等的).
  • GET可以被缓存 (被缓存在本地下次再访问的时候就不用通过网络,而从本地缓存中直接获) ,POST不能被缓存.(这一点也是承接幂等性)
  • 网上有些博客说GET的URL长度(URL+queryString)是有限制的,比如说255个字符,1000个字符.HTTP协议的官方说明对长度不做限制,如果限制也是浏览器或是应用程序自身做出的
1.6.2.3 请求报头(header)

在这里插入图片描述

  • Host: 表示服务器主机的地址和端口
  • Content-Length: 表示body中的数据长度.单位是字节
    POST请求和响应中都有这个字段,只要body中有真实的数据就根据这个值去读
  • Content-Type: 表示请求的body中的数据格式,包含多种格式,目的是告诉浏览器要用什么格式来解析body中的数据
    常见选项:
    • text/html :body数据格式是HTML
    • text/css :body数据格式是CSS
    • application/javascript :body数据格式是JavaScript
    • application/json :body数据格式是JSON
  • User-Agent(简称 UA): 表示浏览器/操作系统的属性
  • Referer: 表示这个页面是从哪个页面跳转过来的
    如果直接在浏览器中输入URL,或者直接通过收藏夹访问页面时是没有Referer的.
  • Cookie: Cookie中存储了⼀个字符串,这个数据可能是客户端(网页)自行通过JS写入的,也可能来自于服务器(服务器在HTTP响应的header中通过Set-Cookie字段给浏览器返回数据).往往可以通过这个字段实现"身份标识"的功能.每个不同的域名下都可以有不同的Cookie,不同网站之间的Cookie并不冲突.可以通过抓包观察页面登陆的过程
  1. 清除之前的cookie
    为了方便观察,先清除掉之前登陆的cookie
    在gitee主页页面上,点击url左侧的图标,选择Cookie
    在这里插入图片描述

然后删除已经存在的Cookie
在这里插入图片描述

  1. 登陆操作
    登陆请求
 POST https://gitee.com/login HTTP/1.1Host: gitee.comConnection: keep-aliveContent-Length: 394Cache-Control: max-age=0sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"sec-ch-ua-mobile: ?0Upgrade-Insecure-Requests: 1Origin: https://gitee.comContent-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/wSec-Fetch-Site: same-originSec-Fetch-Mode: navigateSec-Fetch-User: ?1Sec-Fetch-Dest: documentReferer: https://gitee.com/loginAccept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9,en;q=0.8encrypt_key=password&utf8=%E2%9C%93&authenticity_token=36ZqO9tglSN6EB6pF6f2Gt%2B

登陆响应

 HTTP/1.1 302 FoundDate: Thu, 10 Jun 2021 04:15:58 GMTContent-Type: text/html; charset=utf-8Connection: keep-aliveKeep-Alive: timeout=60Server: nginxX-XSS-Protection: 1; mode=blockX-Content-Type-Options: nosniffX-UA-Compatible: chrome=1Expires: Sun, 1 Jan 2000 01:00:00 GMTPragma: must-revalidate, no-cache, privateLocation: https://gitee.com/HGtz2222Cache-Control: no-cacheSet-Cookie: oschina_new_user=false; path=/; expires=Mon, 10 Jun 2041 04:16:00 -0Set-Cookie: gitee_user=true; path=/Set-Cookie: gitee-session-n=M1Rhbk1QUUxQdWk1VEZVQ1BvZXYybG13ZUJFNGR1V0pSYTZyTllEX-Request-Id: 77f12d095edc98fab27d040a861f63b1X-Runtime: 0.166621Content-Length: 92<html><body>You are being <a href="https://gitee.com/HGtz2222">redirected</a>.</

可以看到,响应中包含了3个Set-Cookie属性.
其中我们重点关注第三个.里面包含了⼀个gitee-session-n 这样的属性,属性值是⼀串很长的
加密之后的信息.这个信息就是用户当前登陆的⾝份标识.也称为 “令牌(token)”

  1. 访问其他页面
    登陆成功之后,此时可以看到后续访问码云的其他页面(比如个人主页),请求中就都会带着刚才获取到的Cookie信息
 GET https://gitee.com/HGtz2222 HTTP/1.1Host: gitee.comConnection: keep-aliveCache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/wSec-Fetch-Site: same-originSec-Fetch-Mode: navigateSec-Fetch-User: ?1Sec-Fetch-Dest: documentsec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"sec-ch-ua-mobile: ?0Referer: https://gitee.com/loginAccept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9,en;q=0.8Cookie: oschina_new_user=false; user_locale=zh-CN; yp_riddler_id=1ce4a551-a160-4

请求中的Cookie字段也包含了⼀个gitee-session-n 属性,里面的值和刚才服务器返回的值
相同.后续只要访问gitee这个网站,就会⼀直带着这个令牌,直到令牌过期/下次重新登陆

1.6.2.4 理解登陆过程

在这里插入图片描述

这个过程和去医院看病很相似.

  1. 到了医院先挂号.挂号时候需要提供⾝份证,同时得到了⼀张"就诊卡",这个就诊卡就相当于患者的 “令牌”.
  2. 后续去各个科室进行检查,诊断,开药等操作,都不必再出示身份证了,只要凭就诊卡即可识别出当前 患者的身份.
  3. 看完病了之后,不想要就诊卡了,就可以注销这个卡.此时患者的身份和就诊卡的关联就销毁了.(类似于网站的注销操作)
  4. 又来看病,可以办⼀张新的就诊卡,此时就得到了⼀个新的"令牌"

2. HTTP响应详解

2.1 “状态码”(statuscode)

状态码表示访问⼀个页面的结果.(是访问成功,还是失败,还是其他的⼀些情况…).
以下为常见的状态码.

  • 200 OK: 这是⼀个最常见的状态码,表示访问成功.
    抓包抓到的大部分结果都是200,表示客户端与服务器之间的请求与响应是没有问题的
  • 404 Not Found: 没有找到资源.浏览器输入⼀个URL,目的就是为了访问对方服务器上的⼀个资源.如果这个URL标识的资源不存在,那么就会出现404
  • 403 Forbidden: 表示访问被拒绝.有的页面通常需要用户具有⼀定的权限才能访问(登陆后才能访问).如果用户没有登陆直接访问,就容易见到403.
  • 405 Method Not Allowed: 前⾯我们已经学习了HTTP中所支持的方法,有GET,POST,PUT,DELETE等.但是对方的服务器不⼀定都支持所有的方法(或者不允许用户使用⼀些其他的方法).如果服务器的某个URL只支持GET方法访问,但用POST PUT DELETE 进行访问的时候就是405
  • 500 Internal Server Error: 服务器出现内部错误.⼀般是服务器的代码执行过程中遇到了⼀些特殊情况(服务器异常崩溃)会产生这个状态码.主要是程序员自己写的代码出现了一些问题
    只要出现了这个状态码,先去看看代码哪儿可能有BUG
  • 504 GatewayTimeout: 当服务器负载比较大的时候,服务器处理单条请求的时候消耗的时间就会很长,就可能会导致出现超时 的情况.这种情况在双十一等"秒杀"场景中容易出现,平时不太容易见到.
  • 302Movetemporarily: 临时重定向(同一个入口根据不同的场景,转发到不同的页面
    也有可能不转发).
    理解"重定向":当前访问的URL并不是最终的地址,当前请求会被转发,转发到最终
    的目的页(落地页)
  • 301 Moved Permanently: 永久重定向.当浏览器收到这种响应时,后续的请求都会被自动改成新的地址. 只要访问这个页面全部无条件重定向主要应用在新旧系统的迁移

小结:

类别原因短语
1XXInformational(信息状态码)接受的请求正在处理
2XXSuccess(成功状态码)请求正常处理完毕
3XXRedirection (重定向状态码)需要进行附加操作以完成请求
4XXClient Error(客户端错误状态码)服务器无法处理请求
5XXSever Error (服务器错误状态码)服务器处理请求出错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十届MathorCup高校数学建模挑战赛-A题:无车承运人平台线路定价问题

目录 摘 要 一、问题提出 1.1 背景 1.2 问题重述 二、基本假设 三、符号说明 四、问题分析 4.1 问题一的分析 4.2 问题二的分析 4.3 问题三的分析 4.4 问题四的分析 五、模型的建立与求解 5.1 问题一模型的建立与求解 5.1.1 数据预处理 5.1.2 问题一结果检验:因子分析模型 5.2…

C++假期练习

思维导图 牛客练习

Go语言-初学者日记(四):包管理

众所周知——“包”治百病。 理解包与模块&#xff0c;是 Go 迈向工程化开发的关键一环&#xff01; &#x1f4c2; 一、包&#xff08;Package&#xff09;是 Go 的基本组织单位 在 Go 中&#xff0c;每个 .go 文件都属于某个包&#xff08;package&#xff09;&#xff1a; …

Scala面向对象2

1. 抽象属性和方法&#xff1a;用 abstract 关键字定义抽象类&#xff0c;其中抽象属性无初始值&#xff0c;抽象方法无实现 。重写抽象方法需用 override &#xff0c;重写抽象属性时&#xff0c;可变属性用 var &#xff0c;不可变属性用 val 。 匿名子类&#xff1a;和 Jav…

DiffAD:自动驾驶的统一扩散建模方法

25年3月来自新加坡公司 Carion 和北航的论文“DiffAD: A Unified Diffusion Modeling Approach for Autonomous Driving”。 端到端自动驾驶 (E2E-AD) 已迅速成为实现完全自动驾驶的一种有前途的方法。然而&#xff0c;现有的 E2E-AD 系统通常采用传统的多任务框架&#xff0c…

Python四大核心数据结构深度解析:列表、元组、字典与集合

在Python编程语言中&#xff0c;数据结构是组织和存储数据的基本方式。Python提供了四种内置的核心数据结构&#xff1a;列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;、字典&#xff08;Dictionary&#xff09;和集合&#xff08;Set&#xff09;。这…

网络编程—Socket套接字(TCP)

上篇文章&#xff1a; 网络编程—Socket套接字&#xff08;UDP&#xff09;https://blog.csdn.net/sniper_fandc/article/details/146923670?fromshareblogdetail&sharetypeblogdetail&sharerId146923670&sharereferPC&sharesourcesniper_fandc&sharefro…

SkyWalking+Springboot实战(最详细)

本篇文章记录了作者在0到1学习SkyWalking的过程&#xff0c;记录了对SkyWalking的部署&#xff0c;学习&#xff0c;使用Bug解决等等过程 一、什么是SkyWalking 官方文档&#xff1a; Apache SkyWalkinghttps://skywalking.apache.org/ SkyWalking 是一个开源的分布式追踪、性…

Arduino示例代码讲解:Row-Column Scanning an 8x8 LED matrix with X-Y input LED矩阵

Arduino示例代码讲解:Row-Column Scanning an 8x8 LED matrix with X-Y input LED矩阵 Row-Column Scanning an 8x8 LED matrix with X-Y input LED矩阵功能概述硬件部分:软件部分:代码逐行解释定义常量定义变量`setup()` 函数`loop()` 函数`readSensors()` 函数`refreshScr…

多线程编程中的锁策略

目录 1.悲观锁vs乐观锁 关键总结 悲观锁&#xff1a; 乐观锁&#xff1a; 选择建议 用 悲观锁 当&#xff1a; 用 乐观锁 当&#xff1a; 2.重量级锁vs轻量级锁 选择建议 用 轻量级锁&#xff1a; 用 重量级锁&#xff1a; 3.挂起等待锁vs自旋锁 关键细节说明 选择…

负载均衡是什么,Kubernetes如何自动实现负载均衡

负载均衡是什么&#xff1f; 负载均衡&#xff08;Load Balancing&#xff09; 是一种网络技术&#xff0c;用于将网络流量&#xff08;如 HTTP 请求、TCP 连接等&#xff09;分发到多个服务器或服务实例上&#xff0c;以避免单个服务器过载&#xff0c;提高系统的可用性、可扩…

React-01React创建第一个项目(npm install -g create-react-app)

1. React特点 JSX是javaScript语法的扩展&#xff0c;React开发不一定使用JSX。单向响应的数据流&#xff0c;React实现单向数据流&#xff0c;减少重复代码&#xff0c;比传统数据绑定更简单。等等 JSX是js的语法扩展&#xff0c;允许在js中编写类似HTML的代码 const …

小程序中的网络请求

在小程序中&#xff0c;使用 wx.request( ) 这个方法来发送网路请求&#xff0c;整个请求的方式和 jQuery 里面的 $.ajax 方法是非常相似的。 在 wx.request( ) 这个方法中&#xff0c;接收一个配置对象&#xff0c;该配置对象中能够配置的项目如下表&#xff1a; 关于服务器…

jvm 的attach 和agent机制

Java 的 Attach 和 Agent 机制在实际应用中得到了广泛的成功应用&#xff0c;尤其是在监控、调试、性能分析、故障排查等方面。以下是这两种机制在实际场景中的一些成功应用案例&#xff1a; 1. 性能监控与分析 Java Agent 和 Attach 机制广泛应用于性能监控和分析&#xff0…

基于SpringBoot的“留守儿童网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“留守儿童网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 局部E-R图 系统首页界面 系统注册…

iPhone XR:一代神机,止步于此

什么样的 iPhone &#xff0c;才配称为一代神机&#xff1f; 我曾经用过iPhone 4S、iPhone 6S Plus、iPhone 8 Plus&#xff0c;iPhone SE2、iPhone XR、iPhone 13、iPhone 14 Plus、iPhone 15/Pro。 不管硬件再怎么卷&#xff0c;不管囊中是否羞涩&#xff0c;主力机基本没考…

【VUE】RuoYi-Vue3项目结构的分析

【VUE】RuoYi-Vue3项目结构的分析 1. 项目地址2. RuoYi-Vue3项目结构2.1 整体结构2.2 package.json2.2.1 &#x1f9fe; 基本信息2.2.2 &#x1f527; 脚本命令&#xff08;scripts&#xff09;2.2.3 &#x1f30d; 仓库信息2.2.4 &#x1f4e6; 项目依赖&#xff08;dependenc…

架构师面试(二十五):分布式存储 Leader 设计

问题 在非常多的分布式存储系统中&#xff0c;如&#xff1a;Zookeeper、Etcd、Kafka等&#xff0c;往往会存在一个 【Leader】 角色&#xff0c;并由该角色负责数据的写入&#xff0c;这样设计最主要的原因是什么呢&#xff1f; A. 唯一负责数据写入的 Leader 角色可以避免并…

使用YoloV5和Mediapipe实现——上课玩手机检测(附完整源码)

目录 效果展示 应用场景举例 1. 课堂或考试监控&#xff08;看到这个学生党还会爱我吗&#xff09; 2. 驾驶安全监控&#xff08;防止开车玩手机&#xff09; 3. 企业办公管理&#xff08;防止工作时间玩手机&#xff09; 4. 监狱、戒毒所、特殊场所安保 5. 家长监管&am…

GPT-4o从语义分割到深度图生成,大模型狂潮下的计算机视觉:技术进步≠替代危机

随着上周&#xff0c;GPT-4o原生多模态图像生成功能的推出&#xff0c;更多玩法也被开发出来。一夜之间&#xff0c;GPT-4o原生多模态能力的释放&#xff0c;让图像生成、语义分割、深度图构建这些曾需要专业工具链支持的复杂任务&#xff0c;变成了普通人输入一句话就能实现的…