1.options请求是什么?什么时候浏览器会发送预检请求
options是预检请求,在真正的请求发送出去之前,浏览器都会先发送一个options请求 向服务器询问此接口是否允许我访问。浏览器在当前真实请求是非常简单请求且跨域的情况下会发起options预检请求。
2。什么是简单请求:
1.请求方法为get,post,head
2.Content-Type限于(application/x-www-form-urlencoded,mutipart/form-data,text/plain)
3.不可以有自定义请求头如xxx-token等
3.什么是复杂请求
非简单请求即为复杂请求
1.常见请求方法为 put delete
2.Content-Type为application/json
3.添加自定义http header
4. 为什么要发预检请求
我们都知道浏览器的同源策略,就是处于安全,浏览器会限制从脚本发起的跨域http请求,像XMLHttpRequest和fetch都遵循同源策略。
浏览器限制跨域请求一般有两种方式:
- 浏览器限制发起跨域请求
- 跨域请求可以正常发起,但是返回的结果被浏览器拦截了
一般浏览器都是第二种方式限制跨域请求,那就是说请求已到达服务器,并有可能对数据库里的数据进行了操作,但是返回的结果被浏览器拦截了,那么我们就获取不到返回结果,这是一次失败的请求,但是可能对数据库里的数据产生了影响。
为了防止这种情况的发生,规范要求,对这种可能对服务器数据产生副作用的HTTP请求方法,浏览器必须先使用OPTIONS方法发起一个预检请求,从而获知服务器是否允许该跨域请求:如果允许,就发送带数据的真实请求;如果不允许,则阻止发送带数据的真实请求。
5. 什么时候发预检请求
HTTP请求包括: 简单请求 和 需预检的请求
- 简单请求
简单请求不会触发CORS预检请求。
若满足所有下述条件,则该请求可视为“简单请求”:
1.请求方法为get,post,head
2.Content-Type限于(application/x-www-form-urlencoded,mutipart/form-data,text/plain)
3.不可以有自定义请求头如xxx-token等
2.需预检的请求
“需预检的请求”要求必须首先使用OPTIONS方法发起一个预检请求到服务区,以获知服务器是否允许该实际请求。“预检请求”的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。
当请求满足下述任一条件时,即应首先发送预检请求:
- 使用了下面任一 HTTP 方法:
- PUT,
- DELETE,
- CONNECT,
- OPTIONS,
- TRACE,
- PATCH
2.人为设置了对 CORS 安全的首部字段集合之外的其他首部字段。该集合为: - Accept,
- Accept-Language,
- Content-Language ,
- Content-Type ,
- DPR,
- Downlink,
- Save-Data ,
- Viewport-Width ,
- Width
3.Content-Type的值不属于下列之一: - application/x-www-form-urlencoded
- multipart/form-data
- text/plain