网络原理 - 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"><EncryptedData xmlns="http://www.w3.org/2001/04/xmlenc#" Id="devicesoftware" 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.C522_SN1.0.D.Cp6GgsxybbCn5NIcYEeXdlTK+D6zwZip99XCUv2IuNO5JdOYQ9Qbdhl46nbeGNA41Istb7j9ukFB5gb4JZwyQ1N/JyPnbkQLjjbuA+w1rZuqmRuT/0nMgF4zqdvJh70q0vzS9Xn2pRAxXb+YxwbAg5cUsmNp7p0thbR6aIqR3cZZdSxk9QOuLyLyyO0Iuf/Ag6zuWgYHe8GzLgQ6+97cnjxAdjrw1Bm9JzjGyAXQqm65VLFzRLu48hcpcj3L2dt46NgQWc0+o5wtBY/iT5XdoB9xpL0UVW3cTTC7a8DbdPyE/KygIqZ42q2Ak0vXDR2egW2XRfK3RpTiRhUaOdhitirqneNBFLD0wjPb04HdRINLCGo7XruZeocWdnFMEz8LWEUyiBca8VM9WYxRfo3z8PhOGWu60ZzezhVZVB32mMZRkkkQecFHVz5lVq5Yq074s9zOvurxQglK8LBGu/cMbXFS+2tr3RO8asJE+EZSFf7j1E4Zz4hjOVKFIz5e720u0vqPBY6GvYmupLoIYyHbZGEdnru/4v8+ledOTxWggS/1</CipherValue></CipherData></EncryptedData></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&uaid=65309187-1129-4074-A0B4-11DB8EC4A1BC&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并不冲突.可以通过抓包观察页面登陆的过程
- 清除之前的cookie
为了方便观察,先清除掉之前登陆的cookie
在gitee主页页面上,点击url左侧的图标,选择Cookie
然后删除已经存在的Cookie
- 登陆操作
登陆请求
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)”
- 访问其他页面
登陆成功之后,此时可以看到后续访问码云的其他页面(比如个人主页),请求中就都会带着刚才获取到的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 理解登陆过程
这个过程和去医院看病很相似.
- 到了医院先挂号.挂号时候需要提供⾝份证,同时得到了⼀张"就诊卡",这个就诊卡就相当于患者的 “令牌”.
- 后续去各个科室进行检查,诊断,开药等操作,都不必再出示身份证了,只要凭就诊卡即可识别出当前 患者的身份.
- 看完病了之后,不想要就诊卡了,就可以注销这个卡.此时患者的身份和就诊卡的关联就销毁了.(类似于网站的注销操作)
- 又来看病,可以办⼀张新的就诊卡,此时就得到了⼀个新的"令牌"
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: 永久重定向.当浏览器收到这种响应时,后续的请求都会被自动改成新的地址. 只要访问这个页面全部无条件重定向主要应用在新旧系统的迁移
小结:
类别 | 原因短语 | |
---|---|---|
1XX | Informational(信息状态码) | 接受的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection (重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Sever Error (服务器错误状态码) | 服务器处理请求出错 |
相关文章:
网络原理 - HTTP/HTTPS
1. HTTP 1.1 HTTP是什么? HTTP (全称为 “超文本传输协议”) 是⼀种应用非常广泛的应用层协议. HTTP发展史: HTTP 诞生于1991年. 目前已经发展为最主流使用的⼀种应用层协议 最新的 HTTP 3 版本也正在完善中, 目前 Google / Facebook 等公司的产品已经…...
JavaScript逆向WebSocket协议解析与动态数据抓取
在JavaScript逆向工程中,WebSocket协议的解析和动态数据抓取是关键技能。本文将结合Fiddler、Charles Proxy和APIfox工具,详细讲解如何解析WebSocket协议并抓取动态数据。 一、WebSocket协议解析 (一)WebSocket协议的基本概念 …...
过滤震荡行行策略思路
本文讨论的是如何识别和过滤金融市场中的震荡行情,特别是对于趋势交易者来说,如何避免在震荡行情中频繁止损和资金回撤。 主要观点 震荡行情的定义 - 行情在有序与无序之间的中间状态,由多空力量不足导致的横盘。 震荡行情的分类 - 宽幅震…...
消息队列(kafka 与 rocketMQ)
为什么要使用消息队列?作用1: 削峰填谷(突发大请求量问题)作用2: 解耦(单一原则)作用3: 异步(减少处理时间) 如何选择消息队列(kafka&RocketMQ)成本功能性能选择 rocketMQ是参考kafka进行实现的为什么rocketMQ与kafka性能差距很大呢?kafka 的底层数据储存实现rocketMQ 的…...
Invalid bean definition with name ‘employeeMapper‘ defined in file。解决问题
求解决方法: Error starting ApplicationContext. To display the condition evaluation report re-run your application with debug enabled. 2025-04-06T15:23:24.87308:00 ERROR 30192 --- [ main] o.s.boot.SpringApplication : Appli…...
使用NVM管理nodejs
使用NVM管理nodejs 前言1. 先清空本地安装的node.js版本2. 下载nvm管理工具3. 安装nvm管理工具4. 输入命令查看nvm版本号5. 查看node.js版本号6. 安装对应版本6.1安装命令6.2使用命令(可以快速切换node版本)6.3成功之后就可以查看本地的node版本了 7. 查…...
第11课:Tiled DiffusionVAE高分辨率放大应用
文章目录 Part.01 Tiled Diffusion原理与基本操作Part.02 Tiled Diffusion超高分辨率升级Part.03 与ControlNet Tile配合使用显存和图片大小的对应关系 Part.01 Tiled Diffusion原理与基本操作 降低显存负担,用不到一半的显存消耗实现同一张大图的绘制,提高超过50%的出图效…...
APS相关知识
MRP 在系统中实现 MRP(物料需求计划) 的逻辑,需要基于 数据库 和 算法 进行自动计算,确保物料按时到达,以满足生产需求。以下是 MRP 的核心逻辑和实现步骤: 📌 MRP 系统实现流程 数据输入&…...
浮点数精度问题
目录 ieee754标准解决方法 和c语言一样,所有以ieee754标准的语言都有浮点数精度问题,js也有浮点数精度问题,并且因为是弱类型语言这个问题更严重,js的Number类型的数据都被视为浮点数 ieee754标准 js的数字类型就相当于c语言doub…...
DHCP Snooping各种场景实验案例
一、概述 DHCP Snooping的基本功能能够保证客户端从合法的服务器获取IP地址,而且能够记录DHCP客户端IP地址与MAC地址等参数的对应关系,进而生成绑定表。 DHCP Snooping的基本功能的配置任务如下(只有前面两个是必选的)。 使能DHCP Snooping功能。配置接口信任状态。(可选)使能…...
设计模式简述(八)中介者模式
中介者模式 描述基本使用使用 描述 为了简化多个类间复杂的耦合关系,单独定义一个中介者 将边界交互的部分交给中介者,从而简化各个类内部逻辑 个人建议在3个及以上的类间存在复杂交互关系时再考虑中介者,否则可能反而增加系统复杂度 基本使…...
【力扣hot100题】(064)在排序数组中查找元素的第一个和最后一个位置
调试了半天终于过了…… 神人题目,主要是情况太太太多了,有先找到左边界的情况、先找到右边界的情况、找到中间节点之后要依次找左右边界的情况……其实要是弄多一点循环应该就不会像我写的这么复杂,但我太懒了就是不想多开循环。 class So…...
【Python爬虫高级技巧】深入掌握lxml库:XPath解析/HTML处理/性能优化全攻略|附企业级实战案例
作为Python生态中最快的HTML/XML解析库,lxml凭借其C语言级别的性能表现,成为爬虫和数据处理的利器。但很多开发者仅停留在基础用法,未能充分发挥其潜力。唐叔将通过本期带你深入剖析lxml的奥秘。 文章目录 一、lxml架构设计揭秘1.1 Cython混合…...
ABAP 新语法 - corresponding
在 ABAP 中,CORRESPONDING 操作符用于根据字段名称自动映射结构体(Structure)或内表(Internal Table)的字段值。它比传统的 MOVE-CORRESPONDING 语句更灵活,支持更多控制选项。 基础用法 data: begin of …...
基于高云fpga实现的fir串行滤波器
大家好,随着国产芯片的崛起,本文将专注于使用国产fpga芯片----高云fpga实现串行fir滤波器的项目 1.fir滤波器简介 设计一个频域滤波器(将想要保留的频率段赋值为1,其他频率段赋值为0),将其与含噪声信号的…...
Spring 中的 BeanFactory 和 ApplicationContext
在 Spring 中,BeanFactory 和 ApplicationContext 都是 IOC 容器的实现接口,负责管理 Bean 的生命周期和依赖注入。但它们之间确实有一些关键区别。 🔍 一、什么是 BeanFactory? BeanFactory 是 Spring 最基础的 IOC 容器接口&am…...
木里风景文化|基于Java+vue的木里风景文化管理平台的设计与实现(源码+数据库+文档)
木里风景文化管理平台 目录 基于SSM+vue的木里风景文化管理平台的设计与实现 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 管理员功能模块 3 用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源…...
国内 windows powershell 安装 scoop
目录 Win10 Terminal Powershell 安装 scoop 失败1. 网络问题2. 报错 Win10 Terminal Powershell 安装 scoop 失败 1. 网络问题 将通常使用的 get.scoop.sh 改为 scoop.201704.xyz (使用scoop国内镜像优化库) 2. 报错 Running the installer as administrator is disabled b…...
【Linux】iptables命令的基本使用
语法格式 iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作或跳转]注意事项 不指定表名时,默认使用 filter 表不指定链名时,默认表示该表内所有链除非设置规则链的缺省策略,否则需要指定匹配条件 设置规则内容 -A:…...
ROS2笔记-2:第一个在Gazebo中能动的例子
第一个在Gazebo中能动的例子 写在前面X-windows 与cursorSimple ROS2 RobotProject StructureFeaturesDependenciesInstallationUsageRobot DescriptionMovement PatternCustomization 解释运行的效果启动控制机器人移动 代码 写在前面 第一个在Gazebo中能动的例子 是指对我来…...
剑指Offer(数据结构与算法面试题精讲)C++版——day6
剑指Offer(数据结构与算法面试题精讲)C版——day6 题目一:不含重复字符的最长子字符串题目二:包含所有字符的最短字符串题目三:有效的回文 题目一:不含重复字符的最长子字符串 这里还是可以使用前面&#x…...
人工智能起源:从图灵到ChatGPT
如今作诗AI的祖先是打卡机、缓慢行动的机器人和神一般的游戏引擎。 “第一台能产生自己想法”的机器问世近70年后,人类的大脑仍然没有真正的对手 1958年冬天,30岁的心理学家弗兰克 罗森布拉特(Frank Rosenblatt)正从康奈尔大学前…...
vue2打包部署到nginx,解决路由history模式下页面空白问题
项目使用的是vue2,脚手架vue-cli 4。 需求:之前项目路由使用的是hash,现在要求调整为history模式,但是整个过程非常坎坷,遇到了页面空白问题。现在就具体讲一下这个问题。 首先,直接讲路由模式由hash改为…...
ASM磁盘组替换
1.udev绑定新磁盘 udevadm control --reload-rules udevadm trigger [rootrac1 ~]# ll /dev/asm* brw-rw---- 1 grid asmadmin 8, 64 Apr 4 13:55 /dev/asm-arc brw-rw---- 1 grid asmadmin 8, 48 Apr 4 14:04 /dev/asm-data brw-rw---- 1 grid asmadmin 8, 80 Apr 4 14:03…...
ZooKeeper集群部署(容器)
文章目录 一、ZooKeeper基本概念二、ZooKeeper集群部署1、前置环境准备2、ZooKeeper伪集群部署(可选)3、ZooKeeper集群部署(可选) 三、ZooKeeper集群验证1、查看集群角色2、数据同步测试3、选举leader测试 一、ZooKeeper基本概念 ZooKeeper是一个分布式且开源的分布式应用程序…...
Scala语言基础:开启你的 Flink 之旅
引言:为什么选择Scala? 大家好,我是心海! Scala(Scalable Language)是一门融合面向对象与函数式编程的现代语言。它像瑞士军刀一样灵活——既能编写简洁的脚本,又能构建复杂的分布式系统。想象你…...
C++计算机视觉实战:100个实际案例分析
【2025最新版】C计算机视觉100个案例算法汇总(长期更新版) 本文是基于C的项目实战,需要具备一点C基础与深度学习基础,并且对opencv、open3d、tensorrt、onnxruntime有一定了解。 你们的订阅是我更新的动力,请订阅、点赞、收藏。 1.Yolov5实…...
V-SHOW和箭头函数在VUE项目的踩坑点
v-show和v-if v-show控制显示隐藏是通过控制CSS的display决定dom节点的显示和隐藏。v-if通过控制dom节点的渲染与否实现元素的显示和隐藏。 在vue中,template标签不参与页面渲染,也不会破坏代码的层级结构,所以多和v-if结合控制元素的显示隐…...
vscode使用方式
一、常用快捷键与代码操作 注释与代码排版 行注释:Ctrl /;块注释:Shift Alt A。 代码缩进:选中代码段后按 Tab(右移)或 Shift Tab(左移)。 代码导航与编辑 快速跳转文件&…...
使用OpenSceneGraph生成3D数据格式文件
OpenSceneGraph (OSG) 提供了多种方式来生成和导出3D数据格式文件。以下是详细的生成方法和示例代码: 一、基本文件生成方法 1. 使用osgDB::writeNodeFile函数 这是最直接的生成方式,支持多种格式: #include <osgDB/WriteFile>osg:…...
网络安全应急响应-系统排查
在网络安全应急响应中,系统排查是快速识别潜在威胁的关键步骤。以下是针对Windows和Linux系统的系统基本信息排查指南,涵盖常用命令及注意事项: 一、Windows系统排查 1. 系统信息工具(msinfo32.exe) 命令执行&#x…...
如何判断JVM中类和其他类是不是同一个类
如何判断JVM中的类是否为同一个类 在Java虚拟机(JVM)中,判断两个类是否相同需要同时满足以下三个条件: 1. 类全限定名必须相同 包括包名类名的完整路径必须完全一致例如:java.lang.String和com.example.String被视为不同类 2. 加载该类的…...
Prolog语言的共识算法
Prolog语言的共识算法 引言 在分布式计算和区块链技术的背景下,共识算法作为确保节点一致性的重要机制,受到了广泛关注。传统的共识算法如PBFT( Practical Byzantine Fault Tolerance )等在许多系统中得到了应用,但随…...
AIDD-深度学习 MetDeeCINE 破译代谢调控机制
深度学习 MetDeeCINE 破译代谢调控机制 目录 使用 FEP/REMD 和 DFT 方法准确预测药物多靶点绝对结合自由能的新途径。Scorpio 框架利用对比学习优化核苷酸序列表示,提升基因组分析效率,尤其在未知序列的分类和泛化能力上表现出色。LPM 模型整合多模态扰…...
pyTorch框架-迁移学习-实现四种天气图片多分类问题
目录 1.导包 2.加载原数据、创建训练与测试目录路径 3.用transforms.Compose、torchvision.datasets.ImageFolder数据预处理 4.加载预训练好的模型 5.固定与修改预训练模型的参数 6.将模型拷到GPU上 7.定义优化器与损失函数 8.定义训练过程 9.测试运行 10.测试结果…...
python1(基础语法输入输出)
输入输出: 输出 print(*objects, sep , end\n, filesys.stdout, flushFalse) objects:这是一个可变参数,意味着你可以传入任意数量的对象。print 函数会将这些对象依次打印出来。在函数内部,这些对象会被转换为字符串形式。 se…...
Linux:页表详解(虚拟地址到物理地址转换过程)
文章目录 前言一、分页式存储管理1.1 虚拟地址和页表的由来1.2 物理内存管理与页表的数据结构 二、 多级页表2.1 页表项2.2 多级页表的组成 总结 前言 在我们之前的学习中,我们对于页表的认识仅限于虚拟地址到物理地址转换的桥梁,然而对于具体的转换实现…...
OpenStack Yoga版安装笔记(十七)安全组笔记
一、安全组与iptables的关系 OpenStack的安全组(Security Group)默认是通过Linux的iptables实现的。以下是其主要实现原理和机制: 安全组与iptables的关系 OpenStack的安全组规则通过iptables的规则链实现。每条安全组规则会被转换为相应的i…...
开源身份和访问管理方案之keycloak(三)keycloak健康检查(k8s)
文章目录 开源身份和访问管理方案之keycloak(三)keycloak健康检查启用运行状况检查 健康检查使用Kubernetes下健康检查Dockerfile 中 HEALTHCHECK 指令 健康检查Docker HEALTHCHECK 和 Kubernetes 探针 开源身份和访问管理方案之keycloak(三&…...
棋盘问题(DFS)
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。 要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放 kk 个棋子的所有可行的摆放方案数目 C…...
verilog学习--1、语言要素
先看一个例子 /*This is first Verilog progaram*/ timescale 1ns/1ns module HalfAdder(A,B,Sum,Carry);input A,B;output Sum, Carry; /**/assign #2 SumA^B;assign #5 CarryA&B; endmodule; Verilog以module为单位编写,每个文件一个module&#…...
from fastmcp import FastMCP和from mcp.server.fastmcp import FastMCP的区别是什么?
文章目录 困惑以方式一开启一个mcp server,并用cline进行调用mcp install server.py修改配置文件以方式二开启MCP server困惑 一直比较困惑的是,好像用python实现mcp server有两种实现方式。 一是使用: https://github.com/modelcontextprotocol/python-sdk 二是使用: …...
QT工程建立
打开软件新建一个工程 选择chose 工程命名,选择保存路径,可以自己选择,但是不要有中文路径 默认的直接下一步 任意选一个下一步 点击完成 之后是这个界面,点击右下角的绿色三角形编译一下 实验内容 添加类 第一个是建立cpp和.h文件…...
Day82 | 灵神 | 快慢指针 重排链表
Day82 | 灵神 | 快慢指针 重排链表 143.重排链表 143. 重排链表 - 力扣(LeetCode) 思路: 笔者直接给跪了,这个难度真是mid吗 直接去看灵神的视频 环形链表II【基础算法精讲 07】_哔哩哔哩_bilibili 1.简单来说就是…...
TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测(Matlab完整源码和数据)
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测(Matlab完整源码和数据) 2.运行环境为Matlab2023b; 3.data为数据集,输入多个特征,输出单个变量&a…...
语法: lcd_load( buffer_pointer, offset, length);
LCD_LOAD() 语法: lcd_load( buffer_pointer, offset, length); 参数: buffer_pointer指向发送给LCD的用户数据; offset是用来将该数据写入LCD,用作进入LCD segment memory的偏移量; length是传送的字节数. 要求: 没有. 功能: 该函数将从CPU的buffer_pointer存储区…...
分治(8题)
目录 一、快排 1.颜色分类 2.排序数组 3.数组中的第k个最大元素 4.最小的K个数 二、归并 1. 排序数组 2.数组中的逆序对 3.计算右侧小于当前元素的个数 4.翻转对 一、快排 1.颜色分类 75. 颜色分类 - 力扣(LeetCode) left和right,初…...
【9】数据结构的串篇章
目录标题 串的定义顺序串的实现初始化赋值打印串求串的长度复制串判断两个串长度是否相等连接两个串比较两个串内容是否相等插入操作删除操作调试与代码合集 串的模式匹配算法朴素的模式匹配算法KMP算法实现模式匹配 串的定义 定义:由0个或多个字符组成的有限序列&…...
Linux file命令
目录 一. file命令简介二. -b 输出结果不显示文件名三. --mime 输出文件的MIME类型字符串四. 批量确认文件类型4.1 -f 从指定的文件中读取文件路径,显示其文件类型4.2 配合find命令查找确认 一. file命令简介 由于Linux系统并不是像Windows系统那样通过扩展名来定义…...
ARM-UART
时钟选择PLCK,超时3ms自动发送,设置发送8位的缓冲区,且发送中断 设置触发深度,达到8字节将缓冲区数据发憷 中断处理函数...