如果我得到一个跨源请求阻塞错误在我的前端,为什么请求似乎仍然得到处理



我的印象是跨域请求被阻止主要是为了防止恶意网站获取或更新您的web服务上的信息。

我注意到,即使一个请求在我的前端被阻塞,代码仍然在后端执行。

例如:

import express = require('express')
const app = express()
const port = 80
app.use(function (req, res, next) {
// res.header("Access-Control-Allow-Origin", "*")
// res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
next()
});
app.get('/foo', (req, res) => {
console.log("test1")
res.json({
data: "Hello"
})
console.log("test2")
})
app.listen(port, () => {
console.log(`app listening at http://localhost:${port}`)
})

如果我的前端然后向快递服务发出请求,请求将因为cross-origin而失败,但快递服务仍将记录

test1
test2

由于源不被允许,express是否应该阻止服务继续运行?如果即使前端出现错误,快递代码仍然执行,这不是安全威胁吗?

在浏览器实现中有两种类型的CORs请求,使用哪一种取决于所发出的特定请求。

对于不需要预飞行的请求,请求被发送到后端,然后浏览器检查结果报头,以查看是否允许CORs请求。如果不允许(如您所示),则请求的结果将被客户端阻止,因此它无法看到请求的结果(即使服务器完全处理了它)。

就我所能从你展示的来看,这里的一切都像预期的那样工作。该请求被视为"简单请求"。而且不需要飞行前准备。如果不是同一个源,基于浏览器的Javascript将不允许从这个路由获取结果。


对于需要预飞行的请求(请求中有一个可以触发预飞行的列表),那么浏览器将首先通过向同一路由发送OPTIONS请求来询问服务器是否允许请求。然后服务器决定是否允许请求。如果浏览器获得了服务器的许可,那么它将发送真正的请求。

你可以在这里看到是什么触发了飞行前。

可以推测,浏览器不会一直使用preflight,因为它的效率较低(需要两倍的请求)。

相关内容

  • 没有找到相关文章

最新更新