网络原理 - HTTP/HTTPS

news2025/4/9 11:11:35

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.1
 Host: gitee.com
 Connection: keep-alive
 Content-Length: 394
  Cache-Control: max-age=0
 sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
 sec-ch-ua-mobile: ?0
 Upgrade-Insecure-Requests: 1
 Origin: https://gitee.com
 Content-Type: application/x-www-form-urlencoded
 User-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/w
 Sec-Fetch-Site: same-origin
 Sec-Fetch-Mode: navigate
 Sec-Fetch-User: ?1
 Sec-Fetch-Dest: document
 Referer: https://gitee.com/login
 Accept-Encoding: gzip, deflate, br
 Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
 encrypt_key=password&utf8=%E2%9C%93&authenticity_token=36ZqO9tglSN6EB6pF6f2Gt%2B

登陆响应

 HTTP/1.1 302 Found
 Date: Thu, 10 Jun 2021 04:15:58 GMT
 Content-Type: text/html; charset=utf-8
 Connection: keep-alive
 Keep-Alive: timeout=60
 Server: nginx
 X-XSS-Protection: 1; mode=block
 X-Content-Type-Options: nosniff
 X-UA-Compatible: chrome=1
 Expires: Sun, 1 Jan 2000 01:00:00 GMT
 Pragma: must-revalidate, no-cache, private
 Location: https://gitee.com/HGtz2222
 Cache-Control: no-cache
 Set-Cookie: oschina_new_user=false; path=/; expires=Mon, 10 Jun 2041 04:16:00 -0
 Set-Cookie: gitee_user=true; path=/
 Set-Cookie: gitee-session-n=M1Rhbk1QUUxQdWk1VEZVQ1BvZXYybG13ZUJFNGR1V0pSYTZyTllE
 X-Request-Id: 77f12d095edc98fab27d040a861f63b1
 X-Runtime: 0.166621
 Content-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.1
 Host: gitee.com
 Connection: keep-alive
 Cache-Control: max-age=0
 Upgrade-Insecure-Requests: 1
 User-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/w
 Sec-Fetch-Site: same-origin
 Sec-Fetch-Mode: navigate
 Sec-Fetch-User: ?1
 Sec-Fetch-Dest: document
 sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
 sec-ch-ua-mobile: ?0
 Referer: https://gitee.com/login
 Accept-Encoding: gzip, deflate, br
 Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
 Cookie: 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.coloradmin.cn/o/2329697.html

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

相关文章

OCC Shape 操作

#pragma once #include <iostream> #include <string> #include <filesystem> #include <TopoDS_Shape.hxx> #include <string>class GeometryIO { public:// 加载几何模型&#xff1a;支持 .brep, .step/.stp, .iges/.igsstatic TopoDS_Shape L…

深度学习入门(四):误差反向传播法

文章目录 前言链式法则什么是链式法则链式法则和计算图 反向传播加法节点的反向传播乘法节点的反向传播苹果的例子 简单层的实现乘法层的实现加法层的实现 激活函数层的实现ReLu层Sigmoid层 Affine层/SoftMax层的实现Affine层Softmax层 误差反向传播的实现参考资料 前言 上一篇…

Linux:页表详解(虚拟地址到物理地址转换过程)

文章目录 前言一、分页式存储管理1.1 虚拟地址和页表的由来1.2 物理内存管理与页表的数据结构 二、 多级页表2.1 页表项2.2 多级页表的组成 总结 前言 在我们之前的学习中&#xff0c;我们对于页表的认识仅限于虚拟地址到物理地址转换的桥梁&#xff0c;然而对于具体的转换实现…

PostgreSQL 一文从安装到入门掌握基本应用开发能力!

本篇文章主要讲解 PostgreSQL 的安装及入门的基础开发能力,包括增删改查,建库建表等操作的说明。navcat 的日常管理方法等相关知识。 日期:2025年4月6日 作者:任聪聪 一、 PostgreSQL的介绍 特点:开源、免费、高性能、关系数据库、可靠性、稳定性。 官网地址:https://w…

WEB安全--内网渗透--LMNTLM基础

一、前言 LM Hash和NTLM Hash是Windows系统中的两种加密算法&#xff0c;不过LM Hash加密算法存在缺陷&#xff0c;在Windows Vista 和 Windows Server 2008开始&#xff0c;默认情况下只存储NTLM Hash&#xff0c;LM Hash将不再存在。所以我们会着重分析NTLM Hash。 在我们内…

8.用户管理专栏主页面开发

用户管理专栏主页面开发 写在前面用户权限控制用户列表接口设计主页面开发前端account/Index.vuelangs/zh.jsstore.js 后端Paginator概述基本用法代码示例属性与方法 urls.pyviews.py 运行效果 总结 欢迎加入Gerapy二次开发教程专栏&#xff01; 本专栏专为新手开发者精心策划了…

室内指路机器人是否支持与第三方软件对接?

嘿&#xff0c;你知道吗&#xff1f;叁仟室内指路机器人可有个超厉害的技能&#xff0c;那就是能和第三方软件 “手牵手” 哦&#xff0c;接下来就带你一探究竟&#xff01; 从技术魔法角度看哈&#xff1a;好多室内指路机器人都像拥有超能力的小魔法师&#xff0c;采用开放式…

从代码上深入学习GraphRag

网上关于该算法的解析都停留在大概流程上&#xff0c;但是具体解析细节未知&#xff0c;由于代码是PipeLine形式因此阅读起来比较麻烦&#xff0c;本文希望通过阅读项目代码来解析其算法的具体实现细节&#xff0c;特别是如何利用大模型来完成图谱生成和检索增强的实现细节。 …

【Redis】通用命令

使用者通过redis-cli客户端和redis服务器交互&#xff0c;涉及到很多的redis命令&#xff0c;redis的命令非常多&#xff0c;我们需要多练习常用的命令&#xff0c;以及学会使用redis的文档。 一、get和set命令&#xff08;最核心的命令&#xff09; Redis中最核心的两个命令&…

微前端随笔

✨ single-spa&#xff1a; js-entry 通过es-module 或 umd 动态插入 js 脚本 &#xff0c;在主应用中发送请求&#xff0c;来获取子应用的包&#xff0c; 该子应用的包 singleSpa.registerApplication({name: app1,app: () > import(http://localhost:8080/app1.js),active…

C++中的浅拷贝和深拷贝

浅拷贝只是将变量的值赋予给另外一个变量&#xff0c;在遇到指针类型时&#xff0c;浅拷贝只会把当前指针的值&#xff0c;也就是该指针指向的地址赋予给另外一个指针&#xff0c;二者指向相同的地址&#xff1b; 深拷贝在遇到指针类型时&#xff0c;会先将当前指针指向地址包…

车载诊断架构 --- 整车重启先后顺序带来的思考

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…

【C++11(下)】—— 我与C++的不解之缘(三十二)

前言 随着 C11 的引入&#xff0c;现代 C 语言在语法层面上变得更加灵活、简洁。其中最受欢迎的新特性之一就是 lambda 表达式&#xff08;Lambda Expression&#xff09;&#xff0c;它让我们可以在函数内部直接定义匿名函数。配合 std::function 包装器 使用&#xff0c;可以…

Windows 10/11系统优化工具

家庭或工作电脑使用时间久了&#xff0c;会出现各种各样问题&#xff0c;今天给大家推荐一款专为Windows 10/11系统设计的全能优化工具&#xff0c;该软件集成了超过40项专业级实用程序&#xff0c;可针对系统性能进行深度优化、精准调校、全面清理、加速响应及故障修复。通过系…

浅谈在HTTP中GET与POST的区别

从 HTTP 报文来看&#xff1a; GET请求方式将请求信息放在 URL 后面&#xff0c;请求信息和 URL 之间以 &#xff1f;隔开&#xff0c;请求信息的格式为键值对&#xff0c;这种请求方式将请求信息直接暴露在 URL 中&#xff0c;安全性比较低。另外从报文结构上来看&#xff0c…

LightRAG实战:轻松构建知识图谱,破解传统RAG多跳推理难题

作者&#xff1a;后端小肥肠 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 2025防失业预警&#xff1a;不会用DeepSeek-RAG建知识库的人正在被淘汰_deepseek-embedding-CSDN博客 从PDF到精准答案&#xff1a;Coze…

C++多线程编码二

1.lock和try_lock lock是一个函数模板&#xff0c;可以支持多个锁对象同时锁定同一个&#xff0c;如果其中一个锁对象没有锁住&#xff0c;lock函数会把已经锁定的对象解锁并进入阻塞&#xff0c;直到多个锁锁定一个对象。 try_lock也是一个函数模板&#xff0c;尝试对多个锁…

垃圾回收——三色标记法(golang使用)

三色标记法(tricolor mark-and-sweep algorithm)是传统 Mark-Sweep 的一个改进&#xff0c;它是一个并发的 GC 算法&#xff0c;在Golang中被用作垃圾回收的算法&#xff0c;但是也会有一个缺陷&#xff0c;可能程序中的垃圾产生的速度会大于垃圾收集的速度&#xff0c;这样会导…

Windows环境下开发pyspark程序

Windows环境下开发pyspark程序 一、环境准备 1.1. Anaconda/Miniconda&#xff08;Python环境&#xff09; 如果不怕包的版本管理混乱&#xff0c;可以直接使用已有的Python环境。 需要安装anaconda/miniconda&#xff08;python3.8版本以上&#xff09;&#xff1a;Anaconda…

SSM婚纱摄影网的设计

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 SS…