使用 Axios 访问控制源标头错误

2023-11-22

我正在 React Web 应用程序中使用 Axios 进行 API 调用。但是,我在 Chrome 中收到此错误:

XMLHttpRequest cannot load
https://example.restdb.io/rest/mock-data. No
'Access-Control-Allow-Origin' header is present on the requested
resource. Origin 'http://localhost:8080' is therefore not allowed
access. 
{
    axios
      .get("https://example.restdb.io/rest/mock-data", {
        headers: {
          "x-apikey": "API_KEY",
        },
        responseType: "json",
      })
      .then((response) => {
        this.setState({ tableData: response.data });
      });
}

我还在 Stack Overflow 上阅读了关于同一问题的几个答案,标题为Access-Control-Allow-Origin但仍然不知道如何解决这个问题。我不想在 Chrome 中使用扩展程序或使用临时 hack 来解决此问题。请提出解决上述问题的标准方法。

在尝试了一些我尝试过的答案之后,

headers: { 
  'x-apikey': '59a7ad19f5a9fa0808f11931',
  'Access-Control-Allow-Origin' : '*',
  'Access-Control-Allow-Methods':'GET,PUT,POST,DELETE,PATCH,OPTIONS',
},

现在我得到的错误是,

Request header field Access-Control-Allow-Origin is not
allowed by Access-Control-Allow-Headers in preflight response 

我将尝试一下这个复杂的主题。

What is origin?

起源本身是主机的名称(方案、主机名和端口),例如https://www.google.com或者可以是本地打开的文件file://等等。这是某些东西(例如网页)的起源地。当您打开网络浏览器并转到https://www.google.com,向您显示的网页的来源是https://www.google.com。您可以在 Chrome 开发工具中看到这一点Security:

如果您通过文件资源管理器(不通过服务器提供服务)打开本地 HTML 文件,则同样适用:

这有什么关系CORS issues?

当您打开浏览器并转到https://website.example,该网站的起源是https://website.example。该网站将最有可能的只是获取图像、图标、js 文件并进行 API 调用https://website.example,基本上它正在调用与其提供服务的同一服务器。它正在对同源进行调用.

例如,如果您打开网络浏览器并打开本地 HTML 文件,并且该 HTML 文件中存在 JavaScript 想要向 Google 发出请求,您会收到以下错误:

同源策略告诉浏览器阻止跨域请求。在本例中,原点null正在尝试请求https://www.google.com (a 跨域请求)。浏览器将不允许这样做,因为设置了 CORS 策略,并且该策略不允许跨域请求。

如果我的页面是从本地主机上的服务器提供的,同样适用:

本地主机服务器示例

如果我们托管自己的 localhost API 服务器,运行在localhost:3000使用以下代码:

const express = require('express')
const app = express()

app.use(express.static('public'))

app.get('/hello', function (req, res) {
    // res.header("Access-Control-Allow-Origin", "*");
    res.send('Hello World');
})

app.listen(3000, () => {
    console.log('alive');
})

并打开一个 HTML 文件(该文件向localhost:3000从文件资源管理器中访问 server) 目录将会发生以下错误:

由于该网页不是由本地主机服务器提供的localhost:3000并且通过文件资源管理器,源与服务器 API 源不同,因此正在尝试跨源请求。由于 CORS 策略,浏览器正在停止此尝试。

但是如果我们取消注释行:

const express = require('express')
const app = express()

app.use(express.static('public'))

app.get('/hello', function (req, res) {
    res.header("Access-Control-Allow-Origin", "*");
    res.send('Hello World');
})

app.listen(3000, () => {
    console.log('alive');
})

现在再试一次:

它可以工作,因为发送 HTTP 响应的服务器现在包含一个标头,表明跨源请求发生在服务器上是可以的,这意味着浏览器将允许它发生,因此不会出现错误。

需要明确的是,CORS 策略是现代浏览器的安全功能,旨在保护人们免受有害和恶意代码的侵害。

如何解决问题(以下之一)

  • 从与您发出的请求所在的同一源(同一主机)提供页面服务。
  • 通过在响应标头中明确说明,允许服务器接收跨源请求。
  • 如果使用反向代理(例如 Nginx),请将 Nginx 配置为发送允许 CORS 的响应标头。
  • 不要使用浏览器。例如,使用 cURL,它不像浏览器那样关心 CORS 策略,并且会为您提供您想要的内容。

流程示例

以下摘自:跨域资源共享 (CORS)

请记住,同源策略告诉浏览器阻止 跨域请求。当你想从某个地方获取公共资源时 不同的来源,资源提供服务器需要告诉 浏览器“请求的来源可以访问我的 资源”。浏览器会记住这一点并允许跨源资源 分享。

  • 步骤1:客户端(浏览器)请求当浏览器发出跨域请求时,浏览器会添加一个 Origin 标头,其中包含 当前来源(方案、主机和端口)。

  • 步骤 2:服务器响应 在服务器端,当服务器看到此标头并想要允许访问时,需要添加一个 响应的 Access-Control-Allow-Origin 标头指定 请求来源(或 * 允许任何来源。)

  • 步骤 3:浏览器接收响应 当浏览器看到带有适当 Access-Control-Allow-Origin 标头的响应时, 浏览器允许与客户端站点共享响应数据。

更多链接

这是另一个很好的答案,更详细地说明了正在发生的事情:https://stackoverflow.com/a/10636765/1137669

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Axios 访问控制源标头错误 的相关文章

  • 单击 DIV 时滚动到顶部? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么用 < 对 JS 数字数组进行排序有效?

    在 JavaScript 中对数字数组进行排序时 我不小心使用了 lt 代替通常 https stackoverflow com questions 1063007 how to sort an array of integers corr
  • 将 C# 3D 数组移植到 JS 3D 数组

    我开发了一个 C 库 它在 3 个项目中使用 这些项目在特定的代码段中中继 不过 我仍然需要在 javascript 中使用该代码 所以将其导出 问题是 我认为我无法复制同样的逻辑 比如这个问题我想了好几天也没有得出答案 在 C 库中 我有
  • For 循环覆盖 HTML 中的文本

    我的数组称为myEmployees其中有 5 个名字 但当我运行代码时 它只打印出其中的 3 个 我相信这种情况正在发生 因为for脚本中的循环会覆盖它在 HTML 文档中编写的前一行 我怎样才能解决这个问题 年度公告板公告 恭喜泰勒 你在
  • 打开一个新的浏览器窗口/iframe 并在 TEXTAREA 中从 HTML 创建新文档?

    我正在尝试使用 HTML5 的新离线功能编写一个 Web 应用程序 在此应用程序中 我希望能够编辑一些 HTML 完整文档 而不是片段
  • 单击链接时如何将另一个 JSP 页面注入到

    我在一个JSP页面中有两个不同的部分 其中一个包含链接菜单 单击时 div2 id content 会相应加载不同的页面 我正在做类似的事情 div ul class navbar li a href Login jsp Login a l
  • onbeforeunload 或单击浏览器后退按钮需要帮助

    如果用户单击浏览器的后退按钮 那么我希望出现提示并要求确认 如果用户单击 确定 那么它应该导航到xx html 如果用户单击 取消 则应阻止导航 我怎样才能做到这一点 注意 我已经尝试过onbeforeunload方法 但它适用于所有导航操
  • 获取与请求

    我正在使用 JSON 流并尝试使用 fetch 来使用它 该流每隔几秒发出一些数据 仅当流关闭服务器端时 使用 fetch 来使用流才可以访问数据 例如 var target the url var options method POST
  • d3 饼图中的文本被路径覆盖

    我正在尝试按照 d3 的饼图示例进行操作http bl ocks org mbostock 3887235 http bl ocks org mbostock 3887235 我的代码的最小示例 const container graph
  • 无法在 .js 文件内命中断点

    我升级到 win 8 现在我在管理员权限下运行 VS 2012 并在 MVC 4 中创建一个网站 我在线检查了不同的解决方案 但没有一个有效 我的解决方案中有一个 javascript 文件 但是当我在其中放置断点时 在运行时我看到 没有为
  • 使用 webpack 保留输出目录中的文件夹结构

    我有以下文件夹结构 index html app index tsx 与 webpack 捆绑后 我希望有以下输出目录 并将bundle js注入到index html中 dist index html dist app bundle js
  • Internet Explorer 10,最大 div 大小为 1.533.917 像素

    我需要制作一个非常大的 div 以百万像素为单位 搜索我发现这个线程证明 IE 可以管理最多 10 000 000 px 确定最大可能的 DIV 高度 https stackoverflow com questions 7719273 de
  • 重写node.js中其他模块中的函数

    我正在尝试在 Node js 应用程序中使用 nodeunit 存根函数 这是我正在尝试做的事情的简化版本 In lib file js var request require request var myFunc function inp
  • 如何将嵌套对象数组转换为 CSV?

    我有一个包含嵌套对象的数组 例如 name 1 children name 1 1 children 1 2 id 2 thing name 2 1 children 2 2 name 3 stuff name 3 1 children 3
  • 我想在使用 Jest Snapshots 时获得图像文件名/路径

    我已经开始使用Jest https facebook github io jest 在一个新项目中有很多 我现在正在使用Snapshot https facebook github io jest docs tutorial react h
  • 使用 JavaScript 自动提交表单

  • Javascript:如何过滤对象数组并对结果求和

    我有一个对象数组 var example a 1 b 2 c 3 a 4 b 5 c 6 a 7 b 8 c 9 我正在尝试添加所有不对应的值c 我已经设法用 console log test filter x gt x c gt 3 过滤
  • 有条件地使用 Node.js 提供两个 React 构建

    我有两个基于设备向客户端提供服务的 React 应用程序 我使用 Node js 和 Express 来实现这一点 我借了static资产处理部分来自这个问题在这里 https stackoverflow com questions 644
  • 有没有办法避开 Google 路线中的特定道路或坐标?

    API 有一个航路点参数 以便 API 计算经过指定航路点的路线 有什么方法可以给出要避开的航路点而不是要经过的航路点 它 目前 尚未实施 有一个开放的功能请求 问题 214 影响方向的能力 例如 避免 路障 https code goog
  • 在不调用“then”的情况下解决 Promise

    我有这段代码 它是我为一个名为 Poolio 的 NPM 模块编写的小型 API 的一部分 对于那些支持错误优先回调和承诺的人来说 我遇到的问题似乎是一个常见问题 我们如何在支持两者的同时保持一致的 API 和 API 的一致返回值 例如

随机推荐