当前位置: 首页 > 知识库问答 >
问题:

Angular客户端启用CORS

颜欣怡
2023-03-14

CORS在服务器上运行良好,并按预期工作。我尝试用angular HTTPClient向服务器的RESTAPI发送请求,但收到一个CORS错误。如果服务器上启用了CORS,为什么会出现此错误?这对客户来说不是很好吗?

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:3000/api/blah/blah (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

共有3个答案

戚弘和
2023-03-14

跨源资源共享(也称CORS)是一种机制,它使用额外的HTTP头通知浏览器提供在一个源运行的web应用程序(例如http://localhost:3000),从不同来源(例如http://localhost:8080)。换句话说,web应用程序从其自身请求具有不同来源(域、协议或端口)的资源时,会执行跨来源HTTP请求。出于安全原因,浏览器限制从脚本启动的跨源HTTP请求。

Access Control Allow Origin标题确定允许哪些来源通过CORS访问服务器资源。

如何解决CORS问题?

您可以通过创建Express中间件自己完成。以下是相应的代码片段:

// Enable CORS for specific origins:


app.use((req, res, next) => {
  // Allow multiple predefined origins
  const allowedOrigins = ["https://deployed-app.com", "http://localhost:3000"];
  const origin = req.headers.origin; // extract the origin from the header
  if (allowedOrigins.indexOf(origin) > -1) { // if the origin is present in our array   
    res.setHeader("Access-Control-Allow-Origin", origin); // set the CORS header on the response
  }
  res.header(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept"
  );
  next(); // move on to the next middleware
});

或者,您可以接受所有请求,但此选项仅适用于您正在开发或您的API是公共的情况:)

 app.use((req, res, next) => {
    res.header("Access-Control-Allow-Origin", "*");
    next();
 });

此外,还有一个ExpressCORS中间件,您将如何使用它:

npm安装cors

启用所有CORS请求:

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

    app.use(cors());

    app.get('/products/:id', function (req, res, next) {
      res.json({msg: 'This is CORS-enabled for all origins!'})
    });

    const port = process.env.PORT || 8080;

    app.listen(port, () => {
     console.log(`CORS-enabled server is up on ${port}`);
   });

为单个路由启用CORS

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

    app.get('/products/:id', cors(), (req, res, next) => {
      res.json({msg: 'This is CORS-enabled for a Single Route'})
    });

     const port = process.env.PORT || 8080;

       app.listen(port, () => {
         console.log(`CORS-enabled server is up on ${port}`);
       });

要点:说到快速中间件,顺序非常重要。因此,确保CORS在任何其他可能依赖它的控制器/路由/中间件之前启用。

公羊晟
2023-03-14

您不需要在angular中启用cors,这是服务器端的问题。见:

https://stackoverflow.com/a/29548846/4461537

唐骏祥
2023-03-14

对于未来的参考,是“戴维斯”的回答帮助了我,cors并没有在所有路由之前添加。

“…意思是,在定义路线之前。”所以在。。。var-app=express();

我只是用。。。应用程序使用(cors());

 类似资料:
  • 问题内容: 我正在创建一个在任何情况下都无法管理或修改的服务器上运行的Web应用程序。 在该应用程序中,我需要执行对其他服务器的AJAX调用。这将始终被“相同原产地政策”阻止。 其中server01.test.net是Web服务器,而mail.test.net是第二台服务器。 有没有一种方法可以通过任何方式在客户端启用CORS,因为我无法在服务器上添加“ Access-Control-Allow-

  • 启动客户端 需要启动一个以太坊客户端,当然如果你已经启动了就不需要再次启动。 如果是geth的话这么启动: $ geth --rpcapi personal,db,eth,net,web3 --rpc --rinkeby 如果是Parity启动: $ parity --chain testnet 如果使用Infura客户端提供的免费的云端服务,这么启动: Web3j web3 = Web3j.

  • 客户端跟服务端基本一样,也支持Web Host和Generic host 调用AddClient方法启用客户端 public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(Compatibility

  • 本文主要描述了在 Kubernetes 上如何为 TiDB 集群的 MySQL 客户端开启 TLS。TiDB Operator 从 v1.1 开始已经支持为 Kubernetes 上 TiDB 集群开启 MySQL 客户端 TLS。开启步骤为: 为 TiDB Server 颁发一套 Server 端证书,为 MySQL Client 颁发一套 Client 端证书。并创建两个 Secret 对象,

  • 问题内容: 使用Websphere MQ 8.x,我们是较大环境中的一个应用程序,并且是某些数据接口的客户端。我们的应用程序是在WildFly 9上运行的Java EE应用程序,该应用程序使用资源适配器()与EAR文件一起部署在同一AS中。我们在两个方向上与MQ服务器进行交互。因此,一方面,我们有一些MDB(由于历史渊源仍是EJB 2.x格式而没有注释)列出了一些队列,并由包含激活配置属性的部署描

  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se