Access如何
显然,我完全误解了它的语义。 我想到了这样的事情:
那么,我错了。 它根本就不能这样工作。 因此,我已阅读跨源资源共享,并尝试在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被允许访问此页面,则浏览器将触发XMLHttpRequest
的error
事件并拒绝对发出请求的JavaScript代码的响应数据。
非简单的请求
在网络层面发生的事情可能比上面解释的稍微复杂一点。 如果请求是“非简单”请求,则浏览器首先发送无数据“预检”OPTIONS请求,以验证服务器是否接受请求。 当(或两者)中的一个请求是非简单的:
Accept
Accept-Language
Content-Language
Content-Type
(当它的值是application/x-www-form-urlencoded
, multipart/form-data
或text/plain
时,这只是简单的) 如果服务器具有适当响应头预检响应OPTIONS( Access-Control-Allow-Headers
用于非简单标头, Access-Control-Allow-Methods
对于非简单动词)匹配非简单动词和/或非那 - 简单的标题,然后浏览器发送实际的请求。
假设网站A想要为/somePage
发送一个PUT请求,并使用非简单的Content-Type
值application/json
,浏览器将首先发送一个预检请求:
OPTIONS /somePage HTTP/1.1
Origin: http://siteA.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: Content-Type
请注意, Access-Control-Request-Method
和Access-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不能直接与远程来自不同域的服务器。 在过去,开发人员创建了许多棘手的方法来实现跨域资源请求,最常用的方式是:
那些棘手的方法或多或少存在一些问题,例如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请求。
例如, XMLHttpRequest
和Fetch
遵循同源策略 。
因此,使用XMLHttpRequest
或Fetch
的Web应用程序只能向自己的域发出HTTP请求 。
跨源资源共享(CORS)
为了改进Web应用程序,开发人员要求浏览器供应商允许跨域请求。
跨源资源共享(CORS)机制为Web服务器提供跨域访问控制 ,从而实现安全的跨域数据传输。
现代浏览器在API容器中使用CORS (例如XMLHttpRequest
或Fetch
)来缓解跨源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: *
上一篇: How does Access