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。