【问题标题】:Can CORS conflict be resolved with modified fetch? [duplicate]可以通过修改后的 fetch 解决 CORS 冲突吗? [复制]
【发布时间】:2019-07-25 03:00:38
【问题描述】:

由于尝试使用 Fetch API 从现有资源页面检索 JSON 数据资源(地震数据)的问题,我感到非常困惑,并且可能消耗了太多脑力。

首先,我在这里尝试解决的任务是完成面试评估,但是,我没想到在编写的第一个代码中开始评估后不久我的努力就会受挫:获取一个 JSON 数据结构,以便在由 Create-React-App 构建的应用程序中进行解析、操作和呈现。

在主要用于检索和解析数据的组件内的 componentDidMount 生命周期内进行提取:

componentDidMount() {
  fetch('http://sitetest.test.com/seismic/data.json', {
    credentials: 'include',
  })
    .then(response => {
      console.log(response);
      response.json();
    })
    .then(earthquakes => {
      this.setState({ earthquakes });
    })
    .catch(error => {
      console.log('====failure====');
      console.log(error);
    });
}

最简单的获取请求会导致向控制台报告 CORS 冲突:

我花了很多时间阅读为什么报告了 CORS 冲突。最终,我阅读的解释归结为错误输出中报告的内容,即:

“请求的资源上没有 'Access-Control-Allow-Origin' 标头。”

在我研究了解决 CORS 问题的可能解决方案时,我读到了诸如“除非您有权访问源服务器代码本身,否则无法解决此问题”here,即 JSON 的主体我正在尝试检索的对象可以通过setting up a proxy 获取(使用此方法仍然没有成功)。

也许我只是对在这种情况下如何使用 Fetch 没有足够的了解。我想做的是尝试通过让我失败的获取请求至少向控制台报告一些有关资源标头的信息来调查问题,这些信息明确显示 "No 'Access-Control-Allow-Origin' 标头存在于请求的资源上。”,但也许我应该对在资源页面上检查控制台中的网络窗格感到满意:

右键单击以在单独的选项卡中查看此图像

对每个响应和请求标头报告中报告的信息感到困惑,我只知道在对数据进行异步请求方面有更多经验的人会指出在解决 CORS 冲突时对他们来说显而易见的事情。我在上面的代码中解决 CORS 问题的最新尝试是在传递给 fetch 的选项对象中包含 credentials。这个想法是在阅读 MDN 在Using Fetch 上的文章时想到的,据我了解,如果在发出请求时遇到这种类型的身份验证配置,它将包含适当的 cookie。资源的请求标头报告中有一个很长的抽象(集合?)cookie 值,但尝试包含我认为在我的获取请求中传递所需 cookie 的必要方法已被证明是不成功的。

在我对这个问题的研究中,我没有发现太多与我的场景相关的内容,这表明解决 CORS 问题的好方法。我感到很失落,真的可以使用一些指导。也许有人可以指出一个很好的资源来处理许多不同的 fetch 操作,因为作为一个基本上是自学成才的人,到目前为止我咨询过的很多网络资源:MDN、论坛、Medium 文章都没有t 让我清楚地拼凑出如何使用适当的修饰符来规避 CORS 政策。

有什么想法吗?

期待从这里继续前进,因为此任务的其余部分涉及在 React 应用程序内部传递数据,我觉得我有足够的经验来克服。

【问题讨论】:

  • 如果可以使用页面上的代码“解决 CORS 问题”,那将是一个巨大的安全问题,“修复”将很快得到修补。
  • 你说这是面试;他们提供了这个资源吗?您认为他们希望您解决 CORS 问题吗?或者也许您可以使用允许跨源请求的不同数据源?
  • 如果你想使用这个资源,你可能需要一个代理,看看这个服务:cors-anywhere.herokuapp.com
  • 浏览器插件可以为所欲为,就像您决定在自己的计算机上运行的任何其他代码一样。但是在客户端 Web 代码的上下文中,浏览器严格执行 CORS。
  • I wasn't sure if that were the thread to follow-through to the solution, or if there existed some more obvious, more 'built-in' solution 如果不清楚,CORS 是一项安全功能,因此 Web 浏览器中的 JavaScript 无法解决它。您需要一台服务器进行合作(原始服务器或代理服务器)

标签: javascript reactjs cors fetch


【解决方案1】:

如果是生产问题 - 您应该调整响应标头(在服务器端)
如果仅用于开发目的(例如,您正在使用 webpack-devserver 并尝试将 api 连接到暂存环境等),您可以:
a) 获取调整 CORS 标头的浏览器扩展 (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin) - 他们将它们更改为 Access-Control-Allow-Origin: "*"
b) 使用适当的启动参数启动浏览器(对于 chrome,请参阅 https://peter.sh/experiments/chromium-command-line-switches/):--disable-web-security

【讨论】:

  • 并非总是如此,如果您从配置中获取端点(从服务器获取)并且您的所有 api 请求已经是:<not-dev-server>/* 在这种情况下 devserver 代理将无济于事(以及从什么我可以看到他的请求不会发送到localhost,而是直接发送到某个服务器)在所有其他情况下,是的,使用代理是一个很好的解决方案:)
  • 是的,可能更难。在这种情况下,Fiddler 会有所帮助。
  • 好吧,从技术上讲,我们也可以使用 http-proxy 并修改响应/请求来更改端点(如果它不是在客户端硬编码的话),但是嗯..我认为在那种情况下它会是一个矫枉过正:)
  • 是的,完全同意
猜你喜欢
  • 1970-01-01
  • 2013-02-18
  • 2020-05-30
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多