复制实例后 CORS 无法正常工作

Posted

技术标签:

【中文标题】复制实例后 CORS 无法正常工作【英文标题】:CORS not working after I copied the instance 【发布时间】:2019-05-12 10:27:08 【问题描述】:

我有一个正在运行的带有 tomcat 7 和 java 应用程序的实例。我想复制该实例。在亚马逊,我点击“创建图像”,并从中启动了一个新实例。之后,我尝试使用新实例。当我提出简单的请求时,它可以工作,但是当我从浏览器尝试时,我得到了 CORS 错误:

Access to XMLHttpRequest at 'https://xxxxxx/getConfiguration' from origin 'http://xxxxxx:9000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

我的服务器或前端配置没有任何变化。当我使用旧服务器时,它可以工作。 cors过滤器是一样的:

<filter>
    <filter-name>CORS</filter-name>
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>

    <init-param>
        <param-name>cors.allowOrigin</param-name>
        <param-value>*</param-value>
    </init-param>
    <init-param>
        <param-name>cors.supportsCredentials</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified, Access-Control-Request-Method,Access-Control-Request-Headers,authorization</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.methods</param-name>
        <param-value>GET,POST,HEAD,OPTIONS,PUT,DELETE</param-value>
    </init-param>
</filter>


<filter-mapping>
    <filter-name>CORS</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

【问题讨论】:

请将&lt;init-param&gt; &lt;param-name&gt;cors.exposed.headers&lt;/param-name&gt; &lt;param-value&gt;Access-Control-Allow-Origin,Access-Control-Allow-Credentials&lt;/param-value&gt; &lt;/init-param&gt; 添加到您的过滤器中,让我知道它是否有效 @Spara 不工作 this 是 tomcat 的 CorsFilter。 this 是 cors 流程图。也许阅读它们可以帮助您解决问题 @Spara 但这已经有效。复制实例时会发生什么变化? 是的,我知道那是一件奇怪的事情! 【参考方案1】:

我只是使用这些依赖项,并且正在使用所有方法,POST、GET 等...

    <dependency>
        <groupId>com.thetransactioncompany</groupId>
        <artifactId>java-property-utils</artifactId>
        <version>1.9.1</version>
    </dependency>

    <dependency>
        <groupId>com.thetransactioncompany</groupId>
        <artifactId>cors-filter</artifactId>
        <version>1.9.1</version>
    </dependency>

在下面的 web.xml 中添加此配置

    <filter>
    <filter-name>CORS</filter-name>
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CORS</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

【讨论】:

【参考方案2】:

比较你使用的初始化参数名称

<init-param>
    <param-name>cors.allowOrigin</param-name>
    <param-value>*</param-value>
</init-param>
<init-param>
    <param-name>cors.supportsCredentials</param-name>
    <param-value>false</param-value>
</init-param>

和configuration reference Tomcat 7 的文档。您拼写错误。

cors.allowed.origins 的默认值于 2018 年 5 月更改(针对 Tomcat 7.0.89、8.5.32、9.0.9)以解决 CVE-2018-8014 (bug 62343)。

【讨论】:

这个答案是准确的。由于某种原因,tomcat 版本从 7.0.89 以下升级到 7.0.89 以上 - 所以参数名称确实发生了变化!【参考方案3】:

您的 javascript/html/css 是否与您的旧实例在同一台服务器上?

当浏览器做一些 API 调用时,如果 API 地址与 javascript 路径在不同的服务器/域中,浏览器将检查 API 的 CORS 头以确保该服务器允许跨域请求。在旧的例子中,一切都在同一个地方,所以没有必要这样做。但在新情况下,您的应用需要将 CORS 标头返回给客户端。

你可以看这个问题来了解如何在Tomcat中为你的应用程序添加CORS头:

Set CORS header in Tomcat

【讨论】:

以上是关于复制实例后 CORS 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

由于 CORS,Spring 和 React websocket 聊天无法正常工作

使用 cors、express 和 google api 的 Node.js 服务器应用程序在 Azure 部署后无法正常工作

localtunnel 和 CORS 无法正常工作

Nancy + .NET Core 使 CORS 无法正常工作

ASP.NET Core Cors 已启用但无法正常工作

根据官方文档,Asp.net Core 3.0 CORS 无法正常工作