将 REST-Call 从 Angular 发送到 Camunda Rest-Engine 时出现 CORS 错误

Posted

技术标签:

【中文标题】将 REST-Call 从 Angular 发送到 Camunda Rest-Engine 时出现 CORS 错误【英文标题】:Getting CORS Error when sending REST-Call from Angular to Camunda Rest-Engine 【发布时间】:2020-10-15 15:54:23 【问题描述】:

我对 Camunda 很陌生,我想编写一个小型 Angular 程序,使用 REST 引擎控制已部署的 BPMN 流程。

到目前为止一切顺利,所以我从 Camunda 官方网站https://camunda.com/de/download/ 下载了开源社区平台。我还能够通过 start-camunda.bat 和在 localhost:8080 上初始化的 TomCat 启动一切。我的流程也已部署,我可以通过 Postman 进行 REST 调用来控制流程并获取信息。

所以通过 Postman 的 REST 调用有效!

现在我的问题。我的 Angular 应用程序在 localhost:4200 上运行在 ng serve 上,当然当我从应用程序发送 GET-Request http://localhost:8080/engine-rest/process-definition 时存在 CORS 问题。

this.http.get<any>('http://localhost:8080/engine-rest/process-definition')
    .subscribe(x => console.log(x));

经过一些互联网研究,我找到了 2 个解决方案。您可以在 Angular 应用程序中设置代理:


解决方案 1 - 代理

src/proxy.conf.json


  "/engine-rest": 
      "target": "http://localhost:8080"
      "secure": false,
      "logLevel": "debug"
  

angular.json

"serve": 
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": 
            "browserTarget": "angularTest:build",
            "proxyConfig": "src/proxy.conf.json"  <-- Add this line
          ,...

如果我随后执行 ng serve,它会告诉我 [HPM] Proxy created: /engine-rest -&gt; http://localhost:8080,但是当我发送 Rest Call 时,它仍然会收到以下 CORS 错误。


解决方案 2 - TomCat web.xml

我尝试的第二个解决方案是在server\apache-tomcat-9.0.33\webapps\engine-rest\WEB-INF\web.xml 下的web.xml 顶部添加一个过滤器,然后重新启动服务器。

过滤器

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

所以这两个 解决方案 都应该解决这个 CORS 错误,但在我的情况下,他们没有,我无法解释如何以及为什么。所以也许它只是超级简单,我只是愚蠢

【问题讨论】:

【参考方案1】:

在代理文件中使用以下代码

//Change

  "/engine-rest": 
      "target": "http://localhost:8080"
      "secure": false,
      "logLevel": "debug"
  


//TO

  "/engine-rest": 
      "target": "https://camunda.com/"
      "secure": false,
      "logLevel": "debug"
  

【讨论】:

这似乎不起作用。仍然得到相同的 CORS 错误。但我发现,如果我使用运行时参数--disable-web-security 运行 Chrome,则 CORS 不再阻止调用。因此,似乎只有浏览器对 CORS 错误负责。但是我仍然很困惑为什么代理不能正常工作...... CORS 无论如何都要从浏览器处理,因为它涉及到 HTTP 请求。也就是说,有什么更新可以解决这个问题吗? @CrazyEight【参考方案2】:

这是从不同的前端到后端的休息调用的一般错误。当您从后端(Tomcat、Jetty、Python、php、Node 等)中的前端(Angular、React 等)调用 api 时,您需要在后端指定一个 cors 过滤器,该过滤器专门允许来自您前端的网址。 在此之后,看看这段代码如何在 Tomcat 中启用它:

 <filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
  <init-param>
    <param-name>cors.support.credentials</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>cors.preflight.maxage</param-name>
    <param-value>10</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

注意带有以下内容的标签:“cors.allowed.origins”,在其下方的相应标签中输入您的前端地址:“http://localhost:4200”(不带“)。

【讨论】:

以上是关于将 REST-Call 从 Angular 发送到 Camunda Rest-Engine 时出现 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 从 angular.js 发送到 node.js

如何将 JWT 令牌从 PHP 发送到 Angular?

将 Map 从 SpringBoot 后端发送到 Angular View 并将其保存在 LocalStorage

如何正确使用 Angular 中的 Observable 将数组数据从父级发送到子级?

text 将文件从Angular发送到.net核心api控制器

将 Blob 数据作为 MultipartFile 从 Angular6 客户端发送到 Spring Boot API