跨域资源共享(Cross-Origin Resource Sharing)是W3C的Web应用工做组退出的一种机制,这种机制能使得Web应用服务器能支持跨站访问控制,从而能够安全地进行跨站数据传输。javascript
CORS须要浏览器和服务器同时支持,参考caniuse.com中各浏览器对CORS的支持状况,目前只有Opera Mini
和IE10
如下不支持。html
CORS中有三种请求类型,简单请求、预请求、附带凭证的请求。java
简单请求有一下特征:跨域
只使用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
才能访问资源。app
预请求会先发一个options给目的站点,验证一下是否能够访问,以后再发实际请求,符合下面状况的就会被当作预请求处理cors
使用GET、HEAD或者POST之外的请求方法。url
使用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形式的跨域请求。