以往做项目,很少和 HTTP 请求头打交道。可在做 SSR 项目时,情况就不一样了,使用频率大幅增加,现在就来记录下这些常用的请求头。
参考资料:developer.mozilla.org/zh-CN/docs/…
Cookie
Cookie
是一个 HTTP 请求标头,其中含有先前由服务器通过Set-Cookie
标头投放或通过 JavaScript 的Document.cookie
方法设置,然后存储到客户端的 HTTP cookie 。这个标头是可选的,而且可能会被忽略,例如在浏览器的隐私设置里面设置为禁用 cookie。
生成过程:
- 服务器发送 Cookie:当用户首次访问一个网站时,服务器可以在 HTTP 响应头中通过 “Set - Cookie” 字段来发送 Cookie。例如,服务器发送的响应头可能包含 “Set - Cookie: username=JohnDoe; Path=/; Expires=Wed, 01 Jan 2025 00:00:00 GMT”,这就将一个名为 “username”,值为 “JohnDoe”,路径为 “/”,过期时间为 2025 年 1 月 1 日的 Cookie 发送给了浏览器。
- 浏览器存储和管理 Cookie:浏览器接收到 “Set - Cookie” 指令后,会根据 Cookie 的属性将其存储在本地。在后续向同一服务器发送请求时,浏览器会检查请求的 URL 的域和路径是否与存储的 Cookie 匹配,以及 Cookie 是否未过期等条件。如果满足条件,浏览器会在 HTTP 请求头中通过 “Cookie” 字段将匹配的 Cookie 发送回服务器。例如,浏览器发送的请求头可能包含 “Cookie: username=XXX”。
- 服务器接收和使用 Cookie:服务器接收到带有 Cookie 的请求后,可以根据 Cookie 中的信息来识别用户,持久化登陆。
使用场景:
以前做SSR项目的时候,保持用户登录就是用的cookie持久化体系+redis 保证登陆状态
Accept
Accept
请求 HTTP 标头表示客户端能够理解的内容类型,以 MIME 类型的形式表达。借助内容协商机制, 服务器可以从诸多备选项中选择一项进行应用,并使用Content-Type
响应标头通知客户端它的选择。浏览器会基于请求的上下文来为这个请求标头设置合适的值,比如,获取一个 CSS 层叠样式表时的值与获取图片、视频或脚本文件时的值是不同的。
例如,在一个 Web 浏览器中访问一个网页,浏览器会发送一个 HTTP 请求到服务器以获取网页内容。在这个请求中,浏览器可能会设置 Accept
头为
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8
这表示浏览器最希望接收的是 text/html
(HTML 文档)或者 application/xhtml+xml
(XHTML 文档)格式的数据来展示网页;也可以接受 application/xml
格式的数据,但优先级稍低(通过 q
值来体现,q
表示质量因子,范围是 0 - 1,这里 0.9
表示相对较低的优先级);同时还能接受一些图像格式(如 image/avif
、image/webp
、image/apng
)的数据;最后的 */*
表示可以接受任何类型的数据,但优先级最低(q = 0.8
)。
User - Agent
User-Agent 请求标头是一个特征字符串,使得服务器和对等网络能够识别发出请求的用户代理的应用程序、操作系统、供应商或版本信息。
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
这表示是运行在 Mac Intel?设备上的 Chrome 131.0.0.0
浏览器。其操作系统是 Mac OS X 10.15.7
,采用 AppleWebKit 537.36
内核,为了保持兼容性,它会添加诸如 KHTML, like Gecko
和 Safari
的字符串。
使用场景:
根据不同的 User-Agent
请求头判断客户端是移动端还是桌面端,进而返回对应的页面
server {
listen 80;
server_name example.com;
# 匹配移动端 User-Agent
if ($http_user_agent ~* "(iPhone|iPad|iPod|Android|BlackBerry|Windows Phone)") {
rewrite ^(.*)$ /mobile/$1 last;
}
# 处理桌面端请求,默认导向桌面端页面目录
location / {
root /var/www/html/desktop;
index index.html index.htm;
}
# 移动端页面目录的配置
location /mobile/ {
root /var/www/html;
index index.html index.htm;
}
}
Authorization
Authorization 是一种用于向服务器发送用户或客户端的认证信息。它提供了一种机制,使得服务器能够识别请求资源的用户身份,并确定该用户是否被授权访问所请求的资源
-
青春版 (Basic Authentication) :
- 格式:
Authorization: Basic <Base64编码后的用户名和密码>
。例如,假设用户名是admin
,密码是123456
,先将admin:123456
进行 Base64 编码,得到YWRtaW46MTIzNDU2
,则请求头为Authorization: Basic YWRtaW46MTIzNDU2
。 - 工作原理:当服务器收到带有这种认证方式的请求头时,会对 Base64 编码的内容进行解码,获取用户名和密码,然后与服务器端存储的用户信息进行比对,以验证用户身份。不过这种认证方式相对简单,安全性较低,因为 Base64 编码很容易被解码。
- 格式:
-
承载令牌认证(Bearer Token Authentication) :
- 格式:
Authorization: Bearer <令牌内容>
。例如,Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
。 - 工作原理:这里的令牌通常是由服务器在用户认证成功后颁发的,如 JSON Web Token(JWT)。JWT 包含了用户的身份信息和权限信息等,通过数字签名保证其完整性和真实性。服务器收到请求后,会验证令牌的有效性,如检查签名是否正确、令牌是否过期等,以此来确定用户是否有权访问资源。这种方式在现代 Web 应用和 API 开发中被广泛使用,因为它更加灵活和安全。
- 格式:
使用场景
- api请求:在需要用户登录才能访问特定资源的场景下,如个人信息页面、付费内容、管理后台等,服务器通过检查
Authorization
请求头来确保只有经过认证的用户才能访问这些资源
service.interceptors.request.use(
config => {
if (store.getters.token) {
config.headers['Authorization'] ='Bearer'+ getToken()
}
return config
},
error => {
return Promise.reject(error)
}
)
- sso单点登录:在多个应用共享用户认证的场景中,
Authorization
头可以用于传递统一的认证令牌,使得用户在不同应用之间切换时无需重复登录。这种一般都是双token,实现无感跳转,以前写过一篇无感刷新思路的,虽然是uniapp,但是原理上是倒差不差的
Content-Type
Content-Type 表示标头用于指示资源的原始媒体类型(在发送时应用任何内容编码之前)。在请求的时候客户端会告诉服务器实际发送的数据类型
content-type:application/json;charset=utf-8
content-type:application/x-www-form-urlencoded
对于客户端向服务器发送请求,Content-Type
告诉服务器消息主体的数据格式。content-type:application/json
表示告诉服务器这是一个json数据格式。charset=utf-8
字符编码标准
content-type:application/x-www-form-urlencoded
就是代表这是一个表单数据结构看起就像:
POST /foo HTTP/1.1
Content-Length: 68137
Content-Type: multipart/form-data; boundary=---------------------------974767299852498929531610575
-----------------------------974767299852498929531610575
Content-Disposition: form-data; name="description"
一些文本
-----------------------------974767299852498929531610575
Content-Disposition: form-data; name="myFile"; filename="foo.txt"
Content-Type: text/plain
(上传文件 foo.txt 的内容)
-----------------------------974767299852498929531610575--
使用场景
在请求配置上默认请求格式,其他(上传之类的)有需求就单独配置其他格式。
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
大概平时用的最多的也就这些了,其他的就随便看看