如何从服务器端启用 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-Headers
和 Access-Control-Allow-Methods
标头—然后是的,浏览器继续执行实际请求以上是关于如何从服务器端启用 CORS?的主要内容,如果未能解决你的问题,请参考以下文章