前言
在做前后端分离项目的时候,发送跨域请求时会发送两个请求,第一个请求为option请求,第二个才是我想要发送的请求。简单了解过后知道这是跨域独有的知识点。
为什么会有两个请求?
原因也非常简单,这是浏览器自动添加的预检机制。这里不讨论浏览器跨域问题,只说这第一个option请求都干了什么。
简单请求
当请求不满足下述任一条件时,即为简单请求
1、使用了下面任一 HTTP 方法:
PUT DELETE CONNECT OPTIONS TRACE PATCH
2、人为设置了对 CORS 安全的首部字段集合之外的其他首部字段。该集合为:
- Accept
- Accept-Language
- Content-Language
- Content-Type (application/x-www-form-urlencoded | multipart/form-data | text/plain)
- DPR
- Downlink
- Save-Data
- Viewport-Width
- Width
对于简单请求,浏览器并不会做过多处理,只是会在请求中需要额外添加一个 Origin 的头部,其中包含请求页面的源信息(协议、域名和端口),以便服务器根据这个头部信息来决定是否给予响应。例如:Origin: http://www.tx.com。
如果服务器认为这个请求可以接受,就在Access-Control-Allow-Origin头部中回发相同的源信息(如果是公共资源,可以回发*)。例如:Access-Control-Allow-Origin: http://www.tx.com。
没有这个头部或者有这个头部但是源信息不匹配,浏览器就会驳回请求。正常请求下,浏览器会处理请求。注意,请求和响应都不包含cookie信息。
如果需要包含cookie信息,ajax请求需要设置xhr的属性withCredentials为true,服务器需要设置响应头部Access-Control-Allow-Credentials: true。
复杂请求
什么是复杂请求?除了简单请求以外都是复杂请求。
对于复杂请求,浏览器会先发送一个option请求用于检验,这个请求会带有如下请求头
-
Origin: www.tx.com
-
Access-Control-Request-Method – 请求种类(get/post/delete等)
-
Access-Control-Request-Headers – 除开上面列举的请求头以外的特殊请求头
之后服务端会返回信息,其中响应头中包含以下信息
-
Access-Control-Allow-Origin – 和简单请求一样
-
Access-Control-Allow-Methods – 这是对预请求当中Access-Control-Request-Method的回复,这一回复将是一个以逗号分隔的列表。尽管客户端或许只请求某一方法,但服务端仍然可以返回所有允许的方法,以便客户端将其缓存。
-
Access-Control-Allow-Headers – 这是对预请求当中Access-Control-Request-Headers的回复
-
Access-Control-Max-Age(可选) – 以秒为单位的缓存时间。
最后
这就算是个小知识点吧,挺基础的0.0