在Docker容器中访问Tomcat时发生CORS错误

我正在构build一个使用REST API与Camunda进程交互的Angular 4应用程序。 尝试login,面临CORS错误。

Dockerfile:

FROM camunda/camunda-bpm-platform:tomcat-latest ADD sample.war /camunda/webapps/sample.war COPY ./web.xml /camunda/webapps/engine-rest/WEB-INF 

像这样运行它:

 docker build -t camunda-eval . docker run -d --name camunda -p 8080:8080 <image> 

控制台中出现错误:

无法加载http:// localhost:8080 / camunda / api / admin / auth / user / default / login / tasklist :请求的资源上没有“Access-Control-Allow-Origin”头。 原因' http:// localhost:4200 '因此不被允许访问。

我的web.xml如下所示:

 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <filter-name>EmptyBodyFilter</filter-name> <filter-class>org.camunda.bpm.engine.rest.filter.EmptyBodyFilter</filter-class> </filter> <filter-mapping> <filter-name>EmptyBodyFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>CacheControlFilter</filter-name> <filter-class>org.camunda.bpm.engine.rest.filter.CacheControlFilter</filter-class> </filter> <filter-mapping> <filter-name>CacheControlFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Http Basic Authentication Filter --> <!-- <filter> <filter-name>camunda-auth</filter-name> <filter-class> org.camunda.bpm.engine.rest.security.auth.ProcessEngineAuthenticationFilter </filter-class> <init-param> <param-name>authentication-provider</param-name> <param-value>org.camunda.bpm.engine.rest.security.auth.impl.HttpBasicAuthenticationProvider</param-value> </init-param> <init-param> <param-name>rest-url-pattern-prefix</param-name> <param-value></param-value> </init-param> </filter> <filter-mapping> <filter-name>camunda-auth</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> --> <filter> <filter-name>Resteasy</filter-name> <filter-class> org.jboss.resteasy.plugins.server.servlet.FilterDispatcher </filter-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>org.camunda.bpm.engine.rest.impl.application.DefaultApplication</param-value> </init-param> </filter> <filter-mapping> <filter-name>Resteasy</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <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> </web-app> 

有想法该怎么解决这个吗?

你得到这个错误,因为“本地主机:4200”和“本地主机:8080”是不同的机器,当涉及到CORS。

一般来说,你有3种方法来避免这种情况:

  1. 只要告诉浏览器忽略CORS(例如chromium-browser --disable-web-security --user-data-dir ) – 如果你只是想玩游戏,这是最快的,但是当然没有生产解决scheme
  2. 在8080上设置CORS标题以允许从4200访问…在这里不适用(很容易,因为你不控制camunda应用程序)
  3. 使用通过反向代理在内部重新路由请求的“边缘”(或“网关”)服务器。 含义:您的浏览器只与网关通话(可以说是端口80),并将请求路由到您的任务列表(4200)或camunda(8080)。 这是解决这个问题的标准方法,如果您查找nginx或zuul,您将find很好的文档。 不过,这需要额外的服务组件。