CORS跨域资源共享

173 阅读2分钟

CORS概述

CORS全称“跨域资源共享”(Cross-origin resource sharing),跨源资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨源请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 CookiesHTTP 认证 相关数据)。

简单点来说就是,cors在浏览器发送跨域请求的时候,在请求中添加一些额外的头信息来实现资源跨域访问。其中,cors请求分为了简单请求复杂请求

简单请求

Q:如何判断是简单请求?
A:同时满足以下条件则为简单请求:
1. 请求方法为HEAD、GET、POST之一;
2. HTTP头信息不超过以下几种字段:

  • Accept
    
  • Accept-Language
    
  •  Content-Language
    
  •  Content-Type  
    
    其中Content-Type的值仅限于:
    • text/plain
    • multipart/form-data
    • application/x-www-form-urlencoded 对于简单请求,浏览器发送CORS请求时候,在头信息中添加Origin字段,origin字段可以说明请求来自哪个源,然后服务器根据这个源决定是否同意本次请求;
      Access-Control-Allow-Origin表示可以接受哪些域名的请求(*为所有) image.png
      Access-Control-Allow-Credentials: true表示是否允许发送cookie image.png

非简单请求

不满足上述的简单请求中的一种条件则属于是非简单请求,非简单请求会在正式请求请求之前进行一次预检请求,即options,服务器收到预检请求会检查OriginAccess-Control-Request-MethodAccess-Control-Request-Headers字段,确认允许跨域后预检请求通过发出正式的HTTP请求,此时浏览器发送正式请求时会携带Origin头部字段
预检请求:
image.png
正式请求:

image.png