为什么会有预检请求
预检请求的发生,来源于浏览器的跨域请求,浏览器对跨域的处理方式一般有两种:
- 浏览器限制客户端发起跨域请求
- 跨域请求正常发起,但是服务器返回的结果被浏览器拦截
一般情况下,跨域产生是第二种情况,服务器对数据已经进行了处理然而结果被浏览器拦截了,造成请求失败。
所以为了避免这种情况,浏览器使用了HTTP的OPTIONS方法发起了一个预检请求,预检请求成功之后才会发起真实的带数据的请求,否则阻止。
何种情况才会触发预检请求呢?
CORS分为两种请求:简单请求和非简单请求。
简单请求
- GET、POST、HEAD请求
- Content-Type的类型:application/x-www-form-urlencoded、multipart/form-data,、text/plain
- HTTP请求头:Accept、Accept-Language、Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width
- 请求中的XMLHttpRequestUpload 对象没有注册任何事件监听器;XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问。
- 请求中没有ReadableStream 对象
非简单请求
- 除了GET、POST、HEAD请求以外的其他请求
- Content-Type的类型:不属于简单请求的类型的以外的类型
- HTTP请求头:除简单请求以外的字段
当是非简单请求时,浏览器会先进行一次预检请求以确定能否正常访问,是一种对数据修改的保护。