跨域资源共享(Cross-Origin Resource Sharing)学习笔记

概念

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

各浏览器支持状况

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

CORS请求类型

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

简单请求

简单请求有一下特征:跨域

  • 只使用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才能访问资源。app

预请求

预请求会先发一个options给目的站点,验证一下是否能够访问,以后再发实际请求,符合下面状况的就会被当作预请求处理cors

  • 使用GET、HEAD或者POST之外的请求方法。url

  • 使用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请求的访问控制

相关文章
相关标签/搜索