我被要求确保我设置的新快速服务器强制执行跨源资源共享(CORS),除非请求来自特定URL。
我在这里找到了官方快递CORS中间件:https://github.com/expressjs/cors
如果我想为所有请求启用CORS,那么我只需要添加app.use(cors())
。
如果我只想允许特定网址,那么我可以将其传递给:
var corsOptions = {
origin: 'http://example.com',
optionsSuccessStatus: 200
}
app.use(cors(corsOptions))
正确?
如果我想阻止所有源/ URL访问我服务器上的资源怎么办?
这只是Express的默认行为吗?
如果我跳过上述所有代码,那么我的服务器将受到保护以免受所有请求的影响?
如果我没有使用CORS中间件启用CORS,我如何能够使用邮递员来测试服务器请求?
谢谢!
如果您未启用CORS中间件,则您的服务器响应将不包含CORS标头,并且浏览器将回退到标准same-origin policy(即,只有相同协议,域和端口上的脚本才能访问它)。
请注意,这些都不是在服务器端强制实施的--CORS只是向浏览器提供信息以允许它做出决策,并且没有什么能阻止浏览器实现简单地忽略CORS头或同源策略。例如,像Postman这样的HTTP客户端通常会完全忽略CORS,因为它与它们无关。
只有当来自不同域的网页尝试访问您的资源时,CORS才会在浏览器中发挥作用。您可以手动检查ctx中的原始标头(不使用任何预构建的中间件)
const origin = ctx.get('origin');
//check if you want to allow this origin
//if you want to allow it,
ctx.set('Access-Control-Allow-Origin', origin);
//else do not set the header or set it something else
ctx.set('Access-Control-Allow-Origin', 'blahblah.com');
浏览器将首先向服务器发送OPTIONS请求以查看它是否允许当前源,如果不是,则浏览器不会继续发出原始请求。如果你查看https://github.com/expressjs/cors的来源,这大致就是它的作用。
如果您没有将这些标头作为响应,浏览器将回退到相同的原始策略。