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 抓包工具下载
下载流程:
页面图:

如果电脑上抓不到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请求.
点击这个请求,查看请求详情
java
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>[email protected]</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
- 登陆操作
登陆请求
java
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
登陆响应
java
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)"
- 访问其他页面
登陆成功之后,此时可以看到后续访问码云的其他页面(比如个人主页),请求中就都会带着刚才获取到的Cookie信息
java
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 理解登陆过程

这个过程和去医院看病很相似.
- 到了医院先挂号.挂号时候需要提供⾝份证,同时得到了⼀张"就诊卡",这个就诊卡就相当于患者的 "令牌".
- 后续去各个科室进行检查,诊断,开药等操作,都不必再出示身份证了,只要凭就诊卡即可识别出当前 患者的身份.
- 看完病了之后,不想要就诊卡了,就可以注销这个卡.此时患者的身份和就诊卡的关联就销毁了.(类似于网站的注销操作)
- 又来看病,可以办⼀张新的就诊卡,此时就得到了⼀个新的"令牌"
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 (服务器错误状态码) | 服务器处理请求出错 |