CORS跨域与Express实现
CORS跨域与Express实现
浏览器跨域问题不用多说,CORS是一个很好的解决办法,浏览器自动实现(IE10+)。
整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
// 手动书写
let corsWhiteList = ['http://localhost:3001', 'http://localhost:3002']
app.use('*', function (req, res, next) {
let origin = req.header('Origin')
if (corsWhiteList.indexOf(origin) == -1) { // 不在白名单列表中。如果全开放的话,将此判断取消即可,设置为“*”是无用的
origin = ''
}
res.header('Access-Control-Allow-Origin', origin)
res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With, yourHeaderFeild')
res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS') //设置方法
res.header('Access-Control-Allow-Credentials', true)
if (req.method == 'OPTIONS') {
res.send(200) // 意思是,在正常的请求之前,会发送一个验证,是否可以请求,非正常简单请求会先发起option询问。
} else {
next()
}
})
// 使用cors中间件,cors中间件的使用与配置见其官方文档
let corsWhiteList = ['http://localhost:3001', 'http://localhost:3002']
let corsOptions = {
origin: function (origin, callback) {
if (corsWhiteList.indexOf(origin) !== -1 || !origin) { // 本机请求未跨域origin不存在
callback(null, true)
} else {
callback(new Error('Not allowed by CORS'))
}
},
credentials: true
}
app.use(cors(corsOptions))
THE END!