CORS

90 阅读2分钟

跨域资源共享 CORS 详解

HTTP访问控制(CORS)

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。

它允许浏览器向跨源服务器,发出[XMLHttpRequest](<http://www.ruanyifeng.com/blog/2012/09/xmlhttprequest_level_2.html>)请求,从而克服了AJAX只能同源使用的限制

使用场景

1.简单请求

1.简单请求

浏览器自动为http请求的头部添加Origin(请求来自哪个源),如果服务器允许该源的跨域请求,则返回包含允许跨域请求的相应头部Access-Control-Allow-Origin的响应消息。响应消息中还可能会包含

Access-Control-Allow-Credentials(是否允许请求携带cookies)Access-Control-Expose-Headers.

若该源不允许跨域请求,则返回普通http响应消息,消息头部不包含Access-Control-Allow-Origin。从而抛出一个错误,被XMLHttpRequest的onerror回调函数捕获。

请求

ET /cors HTTP/1.1 Origin: api.bob.comHost: api.alice.com Accept-Language: en-US Connection: keep-alive User-Agent: Mozilla/5.0...

响应首部字段

Access-Control-Allow-Origin: api.bob.comAccess-Control-Allow-Credentials: true Access-Control-Expose-Headers: FooBar Content-Type: text/html; charset=utf-8

简单请求的条件

  • 条件

withCredentials 属性

2.非简单请求

非简单请求就是在发送跨域请求前,要发送一条包含源信息和可以使用哪些HTTP动词和头信息字段的OPTIONS请求给服务器进行预检。若失败,则跨域请求失败,若成功。则像简单请求一样发送跨域请求。

"预检"请求的头信息包括两个特殊字段。

(1)Access-Control-Request-Method

该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法,上例是PUT

(2)Access-Control-Request-Headers

该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段,上例是X-Custom-Header

非简单请求的条件(简单请求之外)

非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json