跨资源共享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