CORS(Cross-Origin Resource Sharing)是一种浏览器技术的规范,也被称为跨域资源共享。它允许浏览器向跨源服务器发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。CORS需要浏览器和服务器同时支持,所有现代浏览器都支持此功能,但IE浏览器不能低于IE10。
CORS的原理可以概括如下:
- 请求发出方(浏览器):
- 当浏览器发出一个请求时,它会在请求头中携带一个
Origin
字段,这个字段指明了请求的来源(协议 + 域名 + 端口)。
- 当浏览器发出一个请求时,它会在请求头中携带一个
- 服务器端:
- 当服务器接收到这个请求时,它会检查
Access-Control-Allow-Origin
这个响应头。 - 如果服务器允许这个请求,它会返回一个包含
Access-Control-Allow-Origin
的响应头,这个头信息会指明哪些域可以访问该资源,以及是否需要凭据(如Cookie)。 - 如果请求的域不在服务器的许可范围内,服务器会返回一个正常的HTTP响应,但不含
Access-Control-Allow-Origin
字段,此时浏览器会抛出一个错误,被XMLHttpRequest的onerror回调函数捕获。
- 当服务器接收到这个请求时,它会检查
- 浏览器端:
- 如果
Access-Control-Allow-Origin
响应头允许请求来自指定域,并且响应不包含Vary: Origin
头,浏览器将接受响应。 - 否则,浏览器将拒绝响应,不允许其他网站访问资源。
- 如果
CORS的两种请求类型:
- 简单请求(Simple Request):
- 请求方法是HEAD、GET、POST中的一种。
- HTTP的头信息不超出特定的字段范围,如Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type(只限于三个值:application/x-www-form-urlencoded、multipart/form-data、text/plain)。
- 对于简单请求,浏览器直接发出CORS请求,并在头信息中增加一个
Origin
字段。
- 非简单请求(Not-So-Simple Request):
- 不满足简单请求条件的请求都属于非简单请求。
- 对于非简单请求,浏览器会先发出一个预检请求(OPTIONS请求),询问服务器是否允许这个跨域请求。预检请求会包含一些额外的头信息,如
Access-Control-Request-Method
和Access-Control-Request-Headers
,用于告知服务器实际的请求方法和将要使用的头信息。 - 服务器在接收到预检请求后,会检查请求头中的
Origin
字段,并决定是否允许这个跨域请求。如果允许,服务器会返回一个包含Access-Control-Allow-Origin
、Access-Control-Allow-Methods
等响应头的预检响应。 - 浏览器在接收到预检响应后,会判断服务器是否允许这个跨域请求。如果允许,浏览器会发出实际的跨域请求。
CORS的优势在于它可以让所有现代浏览器都支持跨域请求,从而为用户提供更好的体验。然而,需要注意的是,某些古老的浏览器可能不支持CORS或支持有限。