CORS(跨源资源共享)是浏览器允许一个网页发出异域HTTP请求的机制。CORS要求在发出跨域请求时,浏览器通过HTTP头部附加一些特殊的信息来说明请求的来源及访问权限等,以实现跨域访问资源。为了确保CORS的安全性,浏览器对CORS请求分为简单请求和非简单请求两种情况。其中,简单请求和非简单请求都需要服务端正确配置响应头来支持CORS。
区分简单请求和非简单请求是因为浏览器对两种请求的处理方式不同。
简单请求:
- 请求方法为GET, POST, HEAD之一;
- 请求头部只使用一下字段:Accept、Accept-Language、Content-Language、Content-Type(只限于三个值:application/x-www-form-urlencoded、multipart/form-data、text/plain)、DPR、Downlink、Save-Data、Viewport-Width、Width;
对于简单请求,浏览器直接发出CORS请求,在HTTP报文中加入"Origin"头部字段,后端通过响应头"Access-Control-Allow-Origin"进行授权。
非简单请求:
- 请求方法是PUT或DELETE;
- 请求的Content-Type字段的类型application/json、application/xml等等不属于简单请求的数据类型;
- 请求头中使用了任何一个非常见的头信息字段,在这里非常见的头信息字段是指除了以下几个字段之外的其他字段:Accept、Accept-Language、Content-Language、Content-Type、DPR、Downlink、Save-Data、Viewport-Width、Width、Access-Control-Request-Headers、Access-Control-Request-Method、Connection、Cookie、Host、Referer、User-Agent、Cache-control、Origin;
对于非简单请求,浏览器会在发出真正的CORS请求前,先发送一个预检(Preflight)请求——OPTIONS请求,用于询问服务器是否允许这样的非简单请求。服务器响应请求头"Access-Control-Allow-Origin"、"Access-Control-Allow-Methods"、"Access-Control-Allow-Headers"等授权信息来告诉浏览器是否允许这样的请求,浏览器接到授权后才会发出真正的CORS请求,如果授权失败,则放弃此次请求。