【问题标题】:Cross-Origin Resource Sharing when you don't control the server?不控制服务器时的跨域资源共享?
【发布时间】:2017-06-14 20:06:23
【问题描述】:

我有一个网络应用程序,我想在其中使用来自其他网页的信息。一个典型的例子是从预报服务中获取 XML 格式的天气信息。说“https://www.yr.no/place/United_States/New_York/New_York/varsel.xml”。当我尝试将 GET 请求与 XMLHttpRequest 一起使用时,我得到了典型的跨域错误。

解决这个问题的简单方法是让服务器允许 CORS。但是如果我无法控制给定的服务器怎么办?有没有其他方法可以请求数据?

我已经尝试过 Chrome 的 Enable-CORS 扩展,但这不是一个好的解决方案。此外,如果您请求数据的站点需要身份验证(例如用户名/密码),则它不起作用。

我似乎找不到有关此问题的任何信息,但如果这是重复的,我深表歉意。

【问题讨论】:

  • 您需要一个服务器端代理。
  • 感谢您的回复。似乎是唯一的选择。
  • @PederBG 你也可以尝试来自 npm 的 cors 包。 npmjs.com/package/cors

标签: javascript node.js xml cors


【解决方案1】:

对于只想获取网络上公开可用资源的内容(如 https://www.yr.no/place/United_States/New_York/New_York/varsel.xml)并在前端 JavaScript 代码中对其进行处理的简单情况,您无需设置自己的代理,但可以只使用现有的开放公共 CORS 代理,例如 https://cors-anywhere.herokuapp.com/

您无需将 https://www.yr.no/place/United_States/New_York/New_York/varsel.xml 提供给 XHR/Fetch 调用(或 jQuery.get() 或 axios 或任何调用),而是提供以下 URL:

https://cors-anywhere.herokuapp.com/https://www.yr.no/place/United_States/New_York/New_York/varsel.xml

通过开放的 CORS 代理 https://cors-anywhere.herokuapp.com 发送请求,该代理将 Access-Control-Allow-Origin 响应标头添加到它,然后将其作为响应传递回您的请求前端代码。

带有Access-Control-Allow-Origin 响应标头的响应是浏览器看到的,因此浏览器允许您的前端 JavaScript 代码实际访问响应。

但是,如果您要从中请求数据的站点需要身份验证,那么您不希望通过像 https://cors-anywhere.herokuapp.com 这样的第三方代理发出请求,因为这样您就会将凭据暴露给第三方 (第三方代理的所有者)。

但在这种情况下,使用 https://github.com/Rob--W/cors-anywhere 中的代码或其他类似的代码设置您自己的私有代理是相当快速和容易的,或者在您现有的后端代码中设置一些简单的代理机制。

【讨论】:

  • 谢谢,这很有帮助!但它也适用于我提到的第二种情况吗?如果资源受密码保护并且您需要类似:xmlHttp.open('GET', url, true, username, password); xmlHttp.withCredentials = true;
  • 虽然它可以用于需要凭据的请求的情况下,但您不想在这种情况下使用公共代理,因为那样您会将凭据暴露给第三方(公共代理的所有者)。但是对于这种情况,使用github.com/Rob--W/cors-anywhere 中的代码或其他类似的代码来设置您自己的私有代理是相当快速和容易的,或者在您现有的后端代码中设置一些简单的代理机制。我会更新答案以说明这一点。
猜你喜欢
  • 2013-04-01
  • 2011-05-07
  • 2013-01-12
  • 2018-05-04
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 2019-07-13
相关资源
最近更新 更多