跨资源共享CORS

108 阅读2分钟

跨资源共享CORS

跨资源共享

跨资源共享定义了浏览器与服务器如何实现跨源通信。CORS背后的基本思路就是使用自定义的HTTP头部允许浏览器和服务器互相了解,以确定请求或响应应该成功还是失败。

对于简单请求get、post,没有自定义头部,请求体是text/plain类型,这样的请求在发送时会有一个额外的头部叫Origin,Origin头部包含发送请求的页面的源(协议,域名,端口),以便服务器确定是否为其提供响应。

// 请求头部
Origin: http://www.nczonline.net

// 如果服务器决定响应请求,那么应该发送Access-Control-Allow-Origin头部,包含相同的源

Access-Control-Allow-Origin: http://www.nczonline.net

// 如果服务器资源是公开的,那么就包含“ * ”

Access-Control-Allow-Origin: "*"

PS: 跨域请求或者响应都不会包含cookie信息

可以通过将withCredentials 属性设置为 true 来表明请求会发送凭据。

Access-Control-Allow-Credentials: true

预检请求

CORS通过一种预检请求的服务器验证机制,允许使用自定义头部、除GET、POST之外的方法,以及不同请求体内容类型,在要发送设计上述某种高级选项的请求时,会先向服务器发送一个预检请求。这个请求使用options方法发送并包含以下头部

  • Origin: 与简单请求相同
  • Access-Control-Request-Method:请求希望使用的方法。
  • Access-Control-Request-Headers: (可选) 要使用逗号分隔的自定义头部列表
// 一个假设的 POST 请求,包含自定义的 NCZ 头部:

Origin: http://www.nczonline.net 
Access-Control-Request-Method: POST 
Access-Control-Request-Headers: NCZ

在这个请求发送后,服务器可以确定是否允许这种类型的请求。服务器会通过在响应中发送如下头部与浏览器沟通这些信息。

  • Access-Control-Allow-Origin:与简单请求相同。
  • Access-Control-Allow-Methods:允许的方法(逗号分隔的列表)。
  • Access-Control-Allow-Headers:服务器允许的头部(逗号分隔的列表)。
  • Access-Control-Max-Age:缓存预检请求的秒数。
// 服务器响应: 预检请求发送后,结果会响应指定的时间缓存一段时间,
// 只有第一次发送这种类型的请求时才会多发送一次额外的HTTP请求

Access-Control-Allow-Origin: http://www.nczonline.net 
Access-Control-Allow-Methods: POST, GET 
Access-Control-Allow-Headers: NCZ 
Access-Control-Max-Age: 1728000