【问题标题】:Why does an AJAX call to a different website providing an API not violate the Same-Origin Policy?为什么对提供 API 的不同网站的 AJAX 调用不违反同源策略?
【发布时间】:2017-04-01 10:17:43
【问题描述】:

我正在编写一个 React JS 应用程序,从 localhost:8080 运行,然后是我自己的网站,对 the API that openweathermap.org provides 进行 AJAX 调用。

然后这让我想知道,对于 localhost:8080 和我的网站,比如 www.mysite.com,从 http://api.openweathermap.org/data/2.5/forecast 获取数据的 AJAX 调用是否违反了同源策略?

如果示例实际托管在 GitHub 页面上,那么 AJAX 调用实际上无法通过,因为 GitHub 页面现在使用https,而对 API 的 AJAX 调用使用http,不能是https,并且它不会获取数据。

附:可以肯定的是,AJAX 不是通过 JSONP 完成的,正如我在控制台中看到的那样,发出了请求,而响应只是纯 JSON 数据。 (所以没有使用脚本标记方法)。

【问题讨论】:

    标签: cors same-origin-policy


    【解决方案1】:

    http://api.openweathermap.org/data/2.5/forecast 发送 Access-Control-Allow-* 标头:

    $ curl -I http://api.openweathermap.org/data/2.5/forecast
    HTTP/1.1 401 Unauthorized
    Server: openresty
    Date: Sat, 01 Apr 2017 02:11:30 GMT
    Content-Type: application/json; charset=utf-8
    Content-Length: 107
    Connection: keep-alive
    X-Cache-Key: /data/2.5/forecast?
    Access-Control-Allow-Origin: *
    Access-Control-Allow-Credentials: true
    Access-Control-Allow-Methods: GET, POST
    

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS 解释了这些响应标头对浏览器的影响——但要点是,如果您在浏览器中运行的客户端 JavaScript 代码发送跨域请求,并且返回的响应包含 @ 987654326@ 响应标头,然后浏览器会将响应公开给您的代码。但如果响应不包含 Access-Control-Allow-Origin 响应标头,则浏览器将不允许您的代码访问响应。

    【讨论】:

    • 有趣...我以为很多人都知道同源策略,但不是这个Access-Control-Allow-Origin响应头...它甚至有名字...
    • 也许它被称为“CORS”......而维基百科说:“2009 年 3 月,该草案被重命名为“跨源资源共享”,并于 2014 年 1 月被接受为 W3C 推荐。 "我想知道它是在哪一年被广泛使用的......
    • 是的,“CORS”是这一切背后的协议名称。就它变得广泛使用而言,自 2009 年以来,大多数浏览器引擎都支持基本 CORS,但 IE 直到 2012 年推出基本 CORS 支持的 IE10 才支持它。自 2013 年 IE11 首次发布以来,所有浏览器都提供了完整的 CORS 支持。 caniuse.com/#search=cors
    猜你喜欢
    • 1970-01-01
    • 2015-01-19
    • 2011-04-29
    • 1970-01-01
    • 2010-12-22
    • 2016-11-13
    • 2012-08-13
    • 2012-04-22
    • 2014-10-09
    相关资源
    最近更新 更多