关于CORS中的预检请求

621 阅读1分钟

为什么会有预检请求

预检请求的发生,来源于浏览器的跨域请求,浏览器对跨域的处理方式一般有两种:

  1. 浏览器限制客户端发起跨域请求
  2. 跨域请求正常发起,但是服务器返回的结果被浏览器拦截

一般情况下,跨域产生是第二种情况,服务器对数据已经进行了处理然而结果被浏览器拦截了,造成请求失败。

所以为了避免这种情况,浏览器使用了HTTP的OPTIONS方法发起了一个预检请求,预检请求成功之后才会发起真实的带数据的请求,否则阻止。

何种情况才会触发预检请求呢?

CORS分为两种请求:简单请求和非简单请求。

简单请求

  1. GET、POST、HEAD请求
  2. Content-Type的类型:application/x-www-form-urlencoded、multipart/form-data,、text/plain
  3. HTTP请求头:Accept、Accept-Language、Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width
  4. 请求中的XMLHttpRequestUpload 对象没有注册任何事件监听器;XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问。
  5. 请求中没有ReadableStream 对象

非简单请求

  1. 除了GET、POST、HEAD请求以外的其他请求
  2. Content-Type的类型:不属于简单请求的类型的以外的类型
  3. HTTP请求头:除简单请求以外的字段

当是非简单请求时,浏览器会先进行一次预检请求以确定能否正常访问,是一种对数据修改的保护。