1

概念

跨域资源共享(Cross-Origin Resource Sharing)是W3C的Web应用工作组退出的一种机制,这种机制能使得Web应用服务器能支持跨站访问控制,从而可以安全地进行跨站数据传输。

各浏览器支持情况

CORS需要浏览器和服务器同时支持,参考caniuse.com中各浏览器对CORS的支持情况,目前只有Opera MiniIE10以下不支持。

CORS请求类型

CORS中有三种请求类型,简单请求、预请求、附带凭证的请求。

简单请求

简单请求有一下特征:

  • 只使用GET、HEAD或者POST请求方法。

  • 使用POST向服务器端传送数据,数据类型(Content-Type)仅限于application/x-www-form-urlencodedmultipart/form-datatext/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-urlencodedmultipart/form-datatext/plain三种以外类型。

  • 使用了自定义请求头。

预请求的情况中第一次是发送一个options,其中包含了OriginAccess-Control-Request-MethodAccess-Control-Request-Headers等信息, Access-Control-Request-Method告诉服务器接下来请求的请求方法类型、Access-Control-Request-Headers告诉服务器实际请求包含一个自定义请求头,服务器根据这些信息来决定是否接受跨站信息访问。而接下来服务器对options会有一个响应头,包含了Access-Control-Allow-OriginAccess-Control-Request-MethodAccess-Control-Request-HeadersAccess-Control-Max-Age会告知浏览器可接受的请求方法类型,服务器允许把汗的自定义请求头、以及请求对象的验证有效时间,在有效时间内,浏览器处理针对该服务器的跨站请求无需再发送预请求。

附带凭证的请求

对于跨站请求,浏览器一般不会发送凭证信息的,但如果将XMLHttpRequest的withCredentials设为true的话浏览器就会允许发送认证信息,在这种情况下服务器的响应头如果不包含Access-Control-Allow-Credentials: true的话,浏览器不会把响应结果传递给发送请求的脚本程序,以保证信息的安全。还有一点要注意的是给一个带有withCredentials的请求发送响应的时候,服务器必须指定允许请求的域名,不能使用*.否则响应会失败.

使用场景

  • 数据量大的跨域请求中适合CORS。

  • 非GET形式的跨域请求。

参考链接

MDN的HTTP访问控制(CORS)

阮一峰的跨域资源共享 CORS 详解

IT笔录-XMLHttpRequest对象对HTTP请求的访问控制


_咸魚君
280 声望14 粉丝