CORS跨域资源共享

作者阿里云代理 文章分类 分类:linux图文教程 阅读次数 已被围观 735

一、为什么需求跨域计划

1995年Netscape公司在浏览器中引进中了同源战略,最初其含义是A网页设置的cookie,B网页不能翻开,为了确保用户的信息安全,防止被歹意的网站盗取用户的数据。

这个是浏览器中十分重要的战略,后来基本上一切的浏览器都实现了同源战略。虽然确保了浏览器的安全,但是在实际运用中也约束了一些需求进行跨域的运用场景,例如单点登录,这时分就需求有完善的跨域计划。

二、什么是CORS

CORS是Cross-origin resource sharing,跨域资源共享,是一个W3C的标准,一个常用的跨域共享计划。

现在Ajax恳求只答应同源拜访,不答应跨域拜访,而CORS计划答应浏览器向跨源服务器发出XMLHttpRequest恳求,CORS需求浏览器和服务器一起配合进行支撑。

简略的理解,CORS计划完全由浏览器进行操作,用户无感,在建议恳求的时分判别是跨域的恳求会主动增加一些附加头信息,而后端的服务器识别并增加对这类恳求的支撑,CORS针对不同的恳求类型有不同的恳求方式,一是simple  request,二是not-so-simple request。

契合以下两种状况的恳求是simple request

1、恳求的办法是以下三种办法之一。

  • HEAD
  • GET
  • POST

2、HTTP header不超出以下几个字段

  • Accept
  • Accept-Language
  • Content-Language
  • Last-Event-ID
  • Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

超出这两种状况的都归于not-so-simple-request。

三、simple request

针对simple request,在建议恳求今后,浏览器判别是跨域的恳求今后会主动在恳求header中增加Origin字段, 本次恳求来自哪个源,留意是否同源是根据“协议+域名+端口”三者来判别的。

服务端接受到恳求今后需求检查Origin字段的值判别归于哪个源,是否答应对于这个源的拜访恳求。假如答应恳求的话,那么呼应中的header会出现以下这几个字段:

Access-Control-Allow-Origin Access-Control-Allow-Credentials Access-Control-Allow-Credentials Content-Type

其间
Access-Control-Allow-Origin、Content-Type是有必要的字段,Access-Control-Allow-Origin字段阐明答应来自某个源的跨域恳求,它的值要么是恳求时Origin字段的值,要么是一个*(设置为*的状况下,无法跨域获取cookie),表明接受恣意域名的恳求。


Access-Control-Allow-Credentials字段可选,代表是否答应浏览器发送cookie,默认状况下不答应,若需求答应则设置为true,特别阐明,浏览器客户端建议XMLHttpRequest的时分需求同步设置withCredentials特点为true。


Access-Control-Expose-Headers归于可选字段,CORS恳求XMLHttpRequest对象的getResponseHeader办法只能获取到Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma这几个字段,其他的header字段无法获取,若要获取其他字段,则将字段名设置在Access-Control-Expose-Headers字段中。

四、not-so-simple-request

针对not-so-simple-request,例如DELETE恳求,浏览器假如发现这种恳求,那么会先建议一个OPTIONS恳求,表明这个恳求是用来进行询问的,其间header中会有以下字段:

  • Origin
    表明恳求来自哪个源。
  • Access-Control-Request-Method
    希望查询是否支撑的HTTP办法,一般也便是客户端会建议的办法,例如上面提到的DELETE。
  • Access-Control-Request-Headers
    CORS恳求额外发送的header字段

当服务端收到这个OPTIONS恳求今后,假如不支撑跨域恳求,则不增加任何header信息,直接返回即可,假如支撑这个跨域恳求,则增加相应的header

Access-Control-Allow-Methods Access-Control-Allow-Headers Access-Control-Allow-Credentials Access-Control-Max-Age
  • Access-Control-Allow-Methods
    服务器支撑的一切跨域恳求的办法,用逗号分隔。
  • Access-Control-Allow-Headers
    跨域恳求一切支撑的恳求头字段信息,用逗号分隔。
  • Access-Control-Allow-Credentials
    同simple request中的定义。
  • Access-Control-Max-Age
    可选,表明本次OPTIONS恳求能够被浏览器缓存的时间。


本公司销售:阿里云、腾讯云、百度云、天翼云、金山大米云、金山企业云盘!可签订合同,开具发票。

我有话说: