如何从服务器端启用 CORS?

Posted

技术标签:

【中文标题】如何从服务器端启用 CORS?【英文标题】:How is it possible to enable CORS from server-side? 【发布时间】:2018-01-30 03:22:26 【问题描述】:

根据我在 Web API 方面的一点经验,同源策略是浏览器的策略,即浏览器不允许向其他主机而不是源发出请求。我想知道如何从服务器端启用 CORS(谈论 ASP.net Web API)?

这就是我在 webAPI 中启用 CORS 的方式

namespace WebService.Controllers

    [EnableCors(origins: "*", headers: "*", methods: "*")]
    public class TestController : ApiController
    
        // Controller methods ...
    

如果 CORS 是浏览器的东西,那么从客户端启用它不是更合乎逻辑吗?有没有人能解决这个问题

【问题讨论】:

如果用户访问您的网站并且可以仅通过他/她自己的 javascript 启用 cors,那就不再“更合乎逻辑”了 【参考方案1】:

以下是对其工作原理的简短总结:浏览器是实施同源策略和跨源限制的地方。具体来说,浏览器会阻止前端 JavaScript 代码访问来自跨域请求的响应——除非服务器发出请求以在响应中发送响应标头 Access-Control-Allow-Origin

换句话说,让浏览器放宽同源策略的方法是让服务器使用Access-Control-Allow-Origin 标头来表明他们正在选择接受跨域请求。

因此,浏览器是应用或放宽任何跨域限制的地方。

一个有助于说明其工作原理的案例是一个简单的跨域POST。只要跨域POST 没有任何自定义请求标头会触发浏览器执行CORS preflight OPTIONS request,浏览器就会继续发出请求,甚至是跨域的。 POST 发送到的服务器将继续接受它,然后发送响应。

接下来会发生什么来自浏览器的跨域限制——因为如果 POST 请求是使用 XHR 或 Fetch API 或某个 JavaScript 库中的 Ajax 方法从前端 JavaScript 代码发送的,那么除非响应包含Access-Control-Allow-Origin 标头,浏览器将不允许前端代码访问响应(即使服务器接受了POST 并且它成功了)。

无论如何,我希望以上内容有助于阐明在服务器中启用 CORS 支持的实际含义,它有什么影响,以及实际的策略执行是由浏览器执行的。

当然,以上所有内容只是描述了最简单的情况,其中没有会触发浏览器执行CORS preflight OPTIONS request 的请求特征。

但在这种情况下,策略执行全部由浏览器执行——实际上更是如此,例如,浏览器甚至不允许将带有自定义标头的 POST 发送到服务器首先,除非服务器明确指示(在其对预检OPTIONS 的响应中)服务器已选择接收包含该自定义标头的跨域请求。

【讨论】:

感谢您的解释。这是我的理解。无论服务器中是否启用了 CORS,浏览器都会联系服务器。如果启用,Access-Control-Allow-Origin 将被发送到浏览器,并且浏览器会再次继续。对吗? @NithinChandran 对。你所描述的是它的要点——浏览器无论如何都会联系服务器,如果服务器启用了 CORS 支持,那么这意味着它将在其回复中发送一个 Access-Control-Allow-Origin 响应头。 @NithinChandran 但请注意,如果浏览器看到 Access-Control-Allow-Origin 响应标头,它并不总是完全“再次继续”。相反,在最简单的情况下,该标头仅确定浏览器是否将响应公开给您的代码。但是,如果请求是导致浏览器进行预检的请求,则基于对该预检的响应——如果它具有 Access-Control-Allow-Origin 标头,以及具有正确值的 Access-Control-Allow-HeadersAccess-Control-Allow-Methods 标头—然后是的,浏览器继续执行实际请求

以上是关于如何从服务器端启用 CORS?的主要内容,如果未能解决你的问题,请参考以下文章

带有反应打字稿的 SPA Cors .net 核心

在 golang 中启用 Cors 策略

使用弹簧安全性在后端启用 CORS 的正确方法是啥。在 REST 框架的项目中也使用 Apache cxf

用wsdl2java做一个服务端和客户端,服务端启动不来

Nacos3# 服务注册与发现服务端启动源码解析

CORS 防火墙问题