Access如何

显然,我完全误解了它的语义。 我想到了这样的事情:

  • 客户端从http:// siteA下载JavaScript代码MyCode.js - 来源
  • MyCode.js的响应头包含Access-Control-Allow-Origin:http:// siteB ,我认为这意味着MyCode.js被允许对站点B进行跨源引用。
  • 客户端触发MyCode.js的一些功能,而这些功能又向http:// siteB发出请求,尽管它们是跨域请求,但应该没问题。
  • 那么,我错了。 它根本就不能这样工作。 因此,我已阅读跨源资源共享,并尝试在w3c推荐中阅读跨源资源共享

    有一件事是肯定的 - 我仍然不明白我该如何使用这个头文件。

    我完全控制了站点A和站点B.如何启用从站点A下载的JavaScript代码以使用此标头访问站点B上的资源?

    PS

    我不想使用JSONP。


    Access-Control-Allow-Origin是一个CORS(跨源资源共享)头。

    当站点A尝试从站点B获取内容时,站点B可以发送一个Access-Control-Allow-Origin响应标头,告诉浏览器该页面的内容可以被某些来源访问。 (源是域,加上方案和端口号。)默认情况下,站点B的页面不能被任何其他来源访问; 使用Access-Control-Allow-Origin标题为特定请求源的跨源访问打开了一扇门。

    对于站点B想让站点A可访问的每个资源/页面,站点B应该使用响应标头来为其页面提供服务:

    Access-Control-Allow-Origin: http://siteA.com
    

    现代浏览器不会直接阻止跨域请求。 如果站点A从站点B请求一个页面,浏览器将实际获取网络级别上请求的页面,并检查响应标题是否将站点A列为允许的请求者域。 如果站点B未指出站点A被允许访问此页面,则浏览器将触发XMLHttpRequesterror事件并拒绝对发出请求的JavaScript代码的响应数据。

    非简单的请求

    在网络层面发生的事情可能比上面解释的稍微复杂一点。 如果请求是“非简单”请求,则浏览器首先发送无数据“预检”OPTIONS请求,以验证服务器是否接受请求。 当(或两者)中的一个请求是非简单的:

  • 使用除GET或POST之外的HTTP动词(例如PUT,DELETE)
  • 使用非简单的请求标题; 唯一简单的请求标题是:
  • Accept
  • Accept-Language
  • Content-Language
  • Content-Type (当它的值是application/x-www-form-urlencodedmultipart/form-datatext/plain时,这只是简单的)
  • 如果服务器具有适当响应头预检响应OPTIONS( Access-Control-Allow-Headers用于非简单标头, Access-Control-Allow-Methods对于非简单动词)匹配非简单动词和/或非那 - 简单的标题,然后浏览器发送实际的请求。

    假设网站A想要为/somePage发送一个PUT请求,并使用非简单的Content-Typeapplication/json ,浏览器将首先发送一个预检请求:

    OPTIONS /somePage HTTP/1.1
    Origin: http://siteA.com
    Access-Control-Request-Method: PUT
    Access-Control-Request-Headers: Content-Type
    

    请注意, Access-Control-Request-MethodAccess-Control-Request-Headers是由浏览器自动添加的; 你不需要添加它们。 此OPTIONS预检获取成功的响应标题:

    Access-Control-Allow-Origin: http://siteA.com
    Access-Control-Allow-Methods: GET, POST, PUT
    Access-Control-Allow-Headers: Content-Type
    

    发送实际请求时(预检完成后),行为与处理简单请求的方式相同。 换句话说,其预检成功的非简单请求被视为与简单请求相同(即,服务器仍必须为实际响应再次发送Access-Control-Allow-Origin )。

    浏览器发送实际的请求:

    PUT /somePage HTTP/1.1
    Origin: http://siteA.com
    Content-Type: application/json
    
    { "myRequestContent": "JSON is so great" }
    

    并且服务器发送一个Access-Control-Allow-Origin ,就像它对于一个简单的请求一样:

    Access-Control-Allow-Origin: http://siteA.com
    

    有关非简单请求的更多信息,请参阅了解CORS上的XMLHttpRequest。


    跨域请求共享 - 根据Same-Origin-Policy, CORS (AKA跨域AJAX请求)是大多数Web开发人员可能遇到的问题,浏览器限制客户端在安全沙箱中的JavaScript,通常JS不能直接与远程来自不同域的服务器。 在过去,开发人员创建了许多棘手的方法来实现跨域资源请求,最常用的方式是:

  • 使用Flash / Silverlight或服务器端作为“代理”与远程进行通信。
  • JSON与填充(JSONP)。
  • 将远程服务器嵌入到iframe中,并通过fragment或window.name进行通信,请参阅此处。
  • 那些棘手的方法或多或少存在一些问题,例如JSONP可能导致安全漏洞,如果开发人员只是“评估”它,上面#3,虽然它的工作,两个域之间应该建立严格的契约,它既不灵活也不优雅恕我直言:)

    W3C引入了跨源资源共享(CORS)作为标准解决方案,为解决此问题提供了安全,灵活和推荐的标准方法。

    机制

    从高层我们可以简单地认为CORS是来自域A的客户端AJAX调用和域B上托管的页面之间的契约,典型的跨域请求/响应将是:

    DomainA AJAX请求标头

    Host DomainB.com
    User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0
    Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,application/json
    Accept-Language en-us;
    Accept-Encoding gzip, deflate
    Keep-Alive 115
    Origin http://DomainA.com 
    

    DomainB响应标头

    Cache-Control private
    Content-Type application/json; charset=utf-8
    Access-Control-Allow-Origin DomainA.com
    Content-Length 87
    Proxy-Connection Keep-Alive
    Connection Keep-Alive
    

    我在上面标记的蓝色部分是内核事实,“Origin”请求标头“指示了跨源请求或预检请求源自的位置”,“Access-Control-Allow-Origin”响应标头指示此页面允许来自远程请求DomainA(如果值为*表示允许来自任何域的远程请求)。

    正如我上面提到的,W3建议浏览器在提交实际的Cross-Origin HTTP请求之前实施“ 预检请求 ”,简而言之,它是一个HTTP OPTIONS请求:

    OPTIONS DomainB.com/foo.aspx HTTP/1.1
    

    如果foo.aspx支持OPTIONS HTTP动词,它可能会返回如下所示的响应:

    HTTP/1.1 200 OK
    Date: Wed, 01 Mar 2011 15:38:19 GMT
    Access-Control-Allow-Origin: http://DomainA.com
    Access-Control-Allow-Methods: POST, GET, OPTIONS, HEAD
    Access-Control-Allow-Headers: X-Requested-With
    Access-Control-Max-Age: 1728000
    Connection: Keep-Alive
    Content-Type: application/json
    

    只有当响应包含“Access-Control-Allow-Origin”并且其值为“*”或包含提交CORS请求的域时,通过满足这个限制条件,浏览器才会提交实际的跨域请求,并缓存结果在“ 预检结果缓存 ”中。

    三年前我在博客上发表了关于CORS的内容:AJAX Cross-Origin HTTP请求


    问题有点太老,不能回答,但是我发布这个以供将来参考这个问题。

    根据这篇Mozilla开发者网络文章,

    资源在请求来自不同域或资源的资源时,会发出跨源HTTP请求 ,而不是第一个资源本身提供的资源。

    在这里输入图像描述

    从所服务的HTML页面 http://domain-a.com使得一个<img>的SRC请求http://domain-b.com/image.jpg
    今天网络上的许多页面加载资源,如CSS样式表图像和来自不同域的脚本 (因此它应该很酷)。

    同源政策

    出于安全原因,浏览器限制从脚本内发起的 跨源HTTP请求。
    例如, XMLHttpRequestFetch遵循同源策略
    因此,使用XMLHttpRequestFetch的Web应用程序只能向自己的域发出HTTP请求

    跨源资源共享(CORS)

    为了改进Web应用程序,开发人员要求浏览器供应商允许跨域请求。

    跨源资源共享(CORS)机制为Web服务器提供跨域访问控制 ,从而实现安全的跨域数据传输。
    现代浏览器在API容器中使用CORS (例如XMLHttpRequestFetch )来缓解跨源HTTP请求的风险。

    CORS的工作原理( Access-Control-Allow-Origin标题)

    维基百科:

    CORS标准描述了新的HTTP标头,它为浏览器和服务器提供了一种只有在获得许可时才能请求远程URL的方法。

    尽管服务器可以执行一些验证和授权, 但通常浏览器有责任支持这些标头并遵守它们所施加的限制。

  • 浏览器使用Origin HTTP标头发送OPTIONS请求。

    此标头的值是服务于父页面的域。 当http://www.example.com的网页尝试访问service.example.com的用户数据时,以下请求标头将发​​送至service.example.com

    起源:http://www.example.com

  • service.example.com的服务器可能会回应:

  • Access-Control-Allow-Origin (ACAO)标题在其响应中指示允许哪些源网站。
    例如:

    Access-Control-Allow-Origin: http://www.example.com

  • 如果服务器不允许交叉源请求,则为错误页面

  • 具有允许所有域的通配符的Access-Control-Allow-Origin (ACAO)标头:

    Access-Control-Allow-Origin: *

  • 链接地址: http://www.djcxy.com/p/17407.html

    上一篇: How does Access

    下一篇: Should I use JSLint or JSHint JavaScript validation?