cors学习

来源:互联网 发布:尚观linux培训 骗局 编辑:程序博客网 时间:2024/05/29 10:16

原文

跨域资源共享(cross-origin resource sharing

注:

CORS需要浏览 器和服务器同时支持。目前所有浏览器都支持,IE不能低于IE
浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。

简单请求与非简单请求

只要同时满足以下两大条件,就属于简单请求
1. 请求方法是以下三种方法之一:
- HEAD
- GET
- POST
2. HTTP的头信息不超出以下几种字段:
- Accept
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain


对于简单请求,浏览器直接发出CORS请求。就是在头信息中,增加一个Origin字段。用来说明本次请求来自哪个源。服务器再根据这个值,决定是否同意这个请求。如果指定的源不在许可范围内,服务器会返回一个正常的http回应。这个回应的头信息没有包含Access-Control-Allow-Origin字段(祥见下文),从而抛出一个错误,error事件监听,但是这个响应的状态码可能是200

Access-Control-Allow-Origin

该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。

Access-Control-Allow-Credentials

该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。

Access-Control-Expose-Headers

该字段可选。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。上面的例子指定,getResponseHeader(‘FooBar’)可以返回FooBar字段的值。

withCredentials 属性

如果要把Cookie发到服务器,一方面要服务器同意,制定Access-Control-Allow-Credentials字段
Access-Control-Allow-Credentials: true
另一方面还要在ajax请求中打开withCredentials属性。

var xhr = new XMLHttpRequest();xhr.withCredentials = true;
0 0
原创粉丝点击