概念
跨域资源共享(Cross-Origin Resource Sharing)是W3C的Web应用工作组退出的一种机制,这种机制能使得Web应用服务器能支持跨站访问控制,从而可以安全地进行跨站数据传输。
各浏览器支持情况
CORS需要浏览器和服务器同时支持,参考caniuse.com中各浏览器对CORS的支持情况,目前只有Opera Mini
和IE10
以下不支持。
CORS请求类型
CORS中有三种请求类型,简单请求、预请求、附带凭证的请求。
简单请求
简单请求有一下特征:
只使用GET、HEAD或者POST请求方法。
使用POST向服务器端传送数据,数据类型(Content-Type)仅限于
application/x-www-form-urlencoded
、multipart/form-data
、text/plain
。不使用自定义请求头。
浏览器发出的请求头中会有一个自定义的请求头字段Origin
,其中包含了请求来源地址,而服务器也有个响应头Access-Control-Allow-Origin
,一般以Access-Control-Allow-Origin:*
的形式表示所有站点都可以通过XMLHttpRequest
来访问。而如果以Access-Control-Allow-Origin:http://my.com
来表示的话就只有http://my.com
才能访问资源。
预请求
预请求会先发一个options给目的站点,验证一下是否可以访问,之后再发实际请求,符合下面情况的就会被当做预请求处理
使用GET、HEAD或者POST以外的请求方法。
使用POST向服务器端传送数据时,数据类型(Content-Type)为
application/x-www-form-urlencoded
、multipart/form-data
、text/plain
三种以外类型。使用了自定义请求头。
预请求的情况中第一次是发送一个options,其中包含了Origin
、Access-Control-Request-Method
、Access-Control-Request-Headers
等信息, Access-Control-Request-Method
告诉服务器接下来请求的请求方法类型、Access-Control-Request-Headers
告诉服务器实际请求包含一个自定义请求头,服务器根据这些信息来决定是否接受跨站信息访问。而接下来服务器对options会有一个响应头,包含了Access-Control-Allow-Origin
、Access-Control-Request-Method
、Access-Control-Request-Headers
、Access-Control-Max-Age
会告知浏览器可接受的请求方法类型,服务器允许把汗的自定义请求头、以及请求对象的验证有效时间,在有效时间内,浏览器处理针对该服务器的跨站请求无需再发送预请求。
附带凭证的请求
对于跨站请求,浏览器一般不会发送凭证信息的,但如果将XMLHttpRequest
的withCredentials设为true
的话浏览器就会允许发送认证信息,在这种情况下服务器的响应头如果不包含Access-Control-Allow-Credentials: true
的话,浏览器不会把响应结果传递给发送请求的脚本程序,以保证信息的安全。还有一点要注意的是给一个带有withCredentials的请求发送响应的时候,服务器必须指定允许请求的域名,不能使用*.否则响应会失败.
使用场景
数据量大的跨域请求中适合CORS。
非GET形式的跨域请求。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。