来自多个来源的 CORS

Posted

技术标签:

【中文标题】来自多个来源的 CORS【英文标题】:CORS from multiple origins 【发布时间】:2015-11-28 01:19:21 【问题描述】:

我有一个从多个域访问的 Web 服务。由于我无法理解的原因,会话似乎在不同站点之间共享。

    所以,我从 WebAppA 向 API 发出请求。这行得通。

    然后我从 WebAppB 向同一个 Web 服务发出相同的请求。这报告它由于 CORS 政策而被阻止,例如

     The 'Access-Control-Allow-Origin' header has a value 'WebAppA' that is not equal to the supplied origin.  
     Origin 'WebAppB' is therefore not allowed access.
    

但the Tomcat code for the web service 声称它允许 CORS:

我的 web.xml 中有这个:

<param-name>Access-Control-Allow-Origin</param-name>
<param-value>*</param-value>

在处理请求的java类中:

if (StringUtils.isNotBlank(origin)) 
     response.setHeader("Access-Control-Allow-Origin", origin);

从逻辑上讲,这应该允许来自 WebAppB 的请求通过,但它仍然将 WebAppA 视为唯一允许的来源。鉴于上面的 sn-p,想到的一个选项是 Origin 标头可能是空白的。但如果是,那么它肯定不会说 WebAppB 不允许访问,因为它不会知道来源是 WebAppB!?

清除缓存可以解决问题,因此它显然与会话相关,但我看不到任何看起来相关的 cookie。

问题我该如何解决这个问题,以便 webapp A 和 B 可以访问相同的 web 服务,而不清除其间的缓存?

免责声明:这是Possible CORS issue. What's going on and how can I fix it? 的后续内容,但我已经进行了更多调查,以便更清楚地定义问题。 (我希望)。

【问题讨论】:

【参考方案1】:

我怀疑 org/intermine/webservice/server/WebService.java 中有错误。 它说

origin = StringUtils.defaultIfBlank(
                    webProperties.getProperty("ws.response.origin"),
                    request.getHeader("Origin"));

方法参数(src,default)的提供顺序错误,导致服务器总是在“Access-control-allow-origin”中返回一个默认值,而不考虑当前的实际请求...

【讨论】:

以上是关于来自多个来源的 CORS的主要内容,如果未能解决你的问题,请参考以下文章

CORS 规则 nginx-ingress 规则

使用具有多个来源的 PUT 和 DELETE 请求时如何解决 ASP.NET Web API CORS Preflight 问题?

Quarkus 验证来自多个来源的 JWT

Apollo GraphQL 地图列出来自多个来源的实体

带有 html2canvas 的 aws s3 - 多个浏览器的 CORS 问题

对源数据来自多个来源的 Solr 记录进行索引的好方法是啥?