发现问题:network
里有两个请求,多个options
请求。
开发解释:这不用管,是浏览器默认发送的一个预检请求。
半信半疑:明明一次请求,干嘛要两次呢,这不是增大服务端压力吗?
自己求证
1、啥是options请求?
就是预检请求,预先检查服务器是否支持跨域请求,并确认实际请求的安全性。预检请求是由浏览器自动发起的一个额外的 OPTIONS 请求,以获知服务器是否授权后续的实际请求,是为保护客户端的安全,防止不受信任网站利用用户浏览器向其他网站发恶意请求。
2、什么时候触发预检请求?
- 发出非简单
cors
请求,浏览器会做一个http
的查询请求(预检请求)即options
。options
请求会按照简单请求来处理。 - 发送跨域请求时,请求头中包含了一些非简单请求的头信息,如自定义头(custom header)
- 发送跨域请求时,使用了 PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH等请求方法
3、预检请求的报文解析:
预检请求头中除了携带了origin
字段还包含两个特殊字段:
Orign: 表示允许该来源的请求说明资源是共享的,可以拿到;
Access-Control-Request-Method
:告知服务器实际请求使用的HTTP
方法
Access-Control-Request-Headers
:告知服务器实际请求所携带的自定义首部字段
如预检请求头:
上案例:
"预检请求"是由浏览器自动发起的一个额外的 OPTIONS 请求,以获知服务器是否授权后续的实际请求。
4、那么能否避免发送options请求呢?