复制实例后 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>
【问题讨论】:
请将<init-param> <param-name>cors.exposed.headers</param-name> <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value> </init-param>
添加到您的过滤器中,让我知道它是否有效
@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 部署后无法正常工作