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都遵循同源策略。
浏览器限制跨域请求一般有两种方式:

  1. 浏览器限制发起跨域请求
  2. 跨域请求可以正常发起,但是返回的结果被浏览器拦截了

一般浏览器都是第二种方式限制跨域请求,那就是说请求已到达服务器,并有可能对数据库里的数据进行了操作,但是返回的结果被浏览器拦截了,那么我们就获取不到返回结果,这是一次失败的请求,但是可能对数据库里的数据产生了影响。

为了防止这种情况的发生,规范要求,对这种可能对服务器数据产生副作用的HTTP请求方法,浏览器必须先使用OPTIONS方法发起一个预检请求,从而获知服务器是否允许该跨域请求:如果允许,就发送带数据的真实请求;如果不允许,则阻止发送带数据的真实请求。

5. 什么时候发预检请求

HTTP请求包括: 简单请求 和 需预检的请求

  1. 简单请求
    简单请求不会触发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