是否可以在调用端服务器上为 CORS 添加标头?

Posted

技术标签:

【中文标题】是否可以在调用端服务器上为 CORS 添加标头?【英文标题】:Is it possible to add headers for CORS at the calling side server? 【发布时间】:2014-05-11 17:45:36 【问题描述】:

我有一个 GWT 应用程序,其中客户端向另一个域发出请求。 我在 GWT 中使用 RequestBuilder 编写了请求。

在执行代码时,我的浏览器出现错误:

No 'Access-Control-Allow-Origin' header is present on the requested resource.

所以我用谷歌搜索,发现我发出请求的域应该在它发送的响应中添加这个标头。现在我无法控制其他域的服务器,所以我无法在那里进行任何修改。

我的问题是,在我将响应发送到我的客户端之前,我是否可以截获响应和 Access-Control-Allow-Origin 标头以响应其他域的服务器在我的服务器上发送的响应? 我尝试使用过滤器,但过滤器不会被来自另一个域的响应调用。

这可能吗,是我遗漏了什么还是不可能?

【问题讨论】:

【参考方案1】:

Vivek 关于浏览器不允许跨域请求的回答是正确的,除了CORS 机制,支持它的较新浏览器可以以跨源方式尝试也支持它的服务器。

但是,除非远程服务器本身支持它,否则您无能为力。如果我从 A 提供我的应用程序,并想连接到 B,则只有 B 可以授权。如果允许 A 允许我的应用程序通过某些过滤器或 servlet 连接到 B,那么我可以编写一个调用 gmail 或 facebook 或 twitter 的应用程序,并在其他 url 上读取/写入您的设置和个人数据。

因此,您正在联系的跨源服务器必须批准与您提到的标头的连接。取而代之的是,您仍然可以使用自己的服务器作为跨源服务器的代理。

【讨论】:

如果我可以让我的服务器作为代理并尝试授权 CORS 标头,以便我的浏览器确实将请求发送到其他域服务器,那么其他域服务器是否会发送我的数据要求?根据你的说法,我认为这是不可能的。然后我不明白为什么我们必须拥有自己的服务器作为代理。你能解释一下吗? 如果您将服务器用作代理,则不需要 CORS。为了使 CORS 工作,JS 应用程序必须请求远程服务器允许 CORS,并且远程服务器必须批准它 - 您的服务器不参与该对话(并且不能参与,否则这将是攻击其他人的好方法网站)。这些基本上是两个选项:或者远程服务器可以处理 CORS或者您使用自己的服务器作为代理。 好的,我现在明白了。我假设是我的服务器将请求发送到其他域服务器而不是 JS 应用程序。谢谢。【参考方案2】:

根据同源安全策略,Web 浏览器禁止跨域请求。这些限制仅限于基于浏览器的应用程序,因此您绝对可以使用自己的服务器应用程序作为基于 GWT 的客户端应用程序和外部服务器之间的过滤器。

【讨论】:

以上是关于是否可以在调用端服务器上为 CORS 添加标头?的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 开发服务器上为 Soap Web 服务启用 CORS 设置

是否可以将 CORS 标头添加到来自 Tomcat 容器中 j_security_check 的响应

在 .NET Core Web API 上为 CORS 启用 OPTIONS 标头

在 Angular 6 中将 CORS 标头添加到响应中

如何将 CORS 标头添加到 401/403 响应?

NestJs Socket io 适配器:如果使用 false 调用 allowFunction,服务器不会将 CORS 标头添加到握手的响应中。错误或配置错误?