Skip to content

Commit 52294b2

Browse files
张东张东
张东
authored and
张东
committed
add
1 parent d802d84 commit 52294b2

File tree

3 files changed

+51
-1
lines changed

3 files changed

+51
-1
lines changed

.husky/commit-msg

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
pnpm exec commitlint --config commitlint.config.js --edit "${1}"
1+
# pnpm exec commitlint --config commitlint.config.js --edit "${1}"

.vitepress/config.mts

+1
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ export default defineConfig({
280280
text: "http",
281281
items: [
282282
{ text: "概述", link: "/browser/http/introduct" },
283+
{ text: "跨域", link: "/browser/http/crossorigin" },
283284
],
284285
},
285286
],

browser/http/crossorigin.md

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
---
2+
layout: doc
3+
outline: deep
4+
---
5+
## 什么是跨域
6+
浏览器有一个同源策略,要求协议,域名,端口号都相同,当请求url与当前页面url违背了同源策略,即为跨域
7+
## 如何解决跨域
8+
### cors
9+
浏览器将cors请求分为简单请求和非简单请求
10+
11+
[简单请求/非简单请求](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#examples_of_access_control_scenarios)
12+
#### 简单请求
13+
浏览器直接发送请求,会在请求头加上一个`origin`(本次请求来自哪个源(协议 + 域名 + 端口))
14+
15+
如果指定的源,不在许可范围。浏览器会抛出一个cors错误
16+
17+
反之会响应头会加上`Access-Control-Allow-Origin`,如果是一个*,表示接受任意域名的请求。
18+
19+
#### 非简单请求
20+
先发送一个预检请求,"预检"请求用的请求方法是OPTIONS
21+
22+
关键字段是Origin,还包括两个特殊字段`Access-Control-Request-Method`,`Access-Control-Request-Headers(额外发送的请求头字段)`
23+
24+
预检请求失败会抛出cors错误,如果请求成功,返回
25+
26+
* Access-Control-Allow-Methods
27+
28+
该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法。注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次"预检"请求。
29+
30+
* Access-Control-Allow-Headers
31+
32+
如果浏览器请求包括Access-Control-Request-Headers字段,则Access-Control-Allow-Headers字段是必需的。它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段。
33+
34+
* Access-Control-Max-Age
35+
36+
该字段可选,用来指定本次预检请求的有效期,单位为秒
37+
38+
一旦服务器通过了"预检"请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样,会有一个Origin头信息字段。服务器的回应,也都会有一个Access-Control-Allow-Origin头信息字段。
39+
40+
### 使用代理服务器
41+
同源策略是浏览器需要遵循的标准,而如果是服务器向服务器请求就没有跨域一说。
42+
43+
1. 接受客户端请求 。
44+
2. 将请求转发给服务器。
45+
3. 拿到服务器响应数据。
46+
4. 将响应转发给客户端。
47+
48+
仍然需要返回`Access-Control-Allow-Origin`
49+
尽管代理服务器代替了客户端直接与外部API交互,但代理服务器仍然是一个“外部”请求的最终响应者。浏览器会检查从代理服务器返回的响应,确保其符合CORS的要求。

0 commit comments

Comments
 (0)