node koa2设置允许多个域名跨域并携带cookie
原文链接: https://www.cnblogs.com/yalong/p/16450036.html
一般情况下,koa2设置跨域资源共享,下面的代码就够用了
app.use(async (ctx, next) => {
ctx.set('Access-Control-Allow-Origin', '*');
ctx.set('Access-Control-Allow-Headers', 'x-requested-with, accept, origin, content-type');
ctx.set('Access-Control-Allow-Methods', 'OPTIONS, GET, PUT, POST, DELETE');
await next();
});
上述代码对不需要携带cookie
的情况,是没问题的,但是如果需要携带cookie
,就不行了,
Access-Control-Allow-Origin
不能设置为 *
, 需要设置为具体的域名,而且还得加上 ctx.set('Access-Control-Allow-Credentials', 'true');
那么想要设置多个域名的跨域该怎么做呢,网上查到下面这种
Access-Control-Allow-Origin: https://www.aaa.com,https://www.bbb.com
但是一直有错误,行不通,于是有了下面这种方法
app.js
中代码如下
app.use(async (ctx, next) => {
ctx.set('Access-Control-Allow-Headers', 'x-requested-with, accept, origin, content-type');
ctx.set('Access-Control-Allow-Credentials', 'true');
ctx.set('Access-Control-Allow-Methods', 'OPTIONS, GET, PUT, POST, DELETE');
await next();
});
router.js中添加下面这个路由
router.all('*', async (ctx, next) => {
// 这里可以加上判断,看下这个域名是否有跨域的权限,没有的话就不用设置下面的代码了
ctx.set('Access-Control-Allow-Origin', ctx.request.header.origin);
await next(); // 进行下一步,匹配其他路由
});
就是在路由匹配之前,都走router.all * ,如果允许全部域名跨域,就直接设置
ctx.set('Access-Control-Allow-Origin', ctx.request.header.origin);
同时前端发送请求的时候也要加点配置
- 对于 XMLHttpRequerst 创建的ajax请求,需要设置 withCredentials 为 true
- 对于fetch 请求,需要设置 credentials 为 include
这样就能实现任意网站的跨域携带cookie的请求了
参考网址: