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);

同时前端发送请求的时候也要加点配置

  1. 对于 XMLHttpRequerst 创建的ajax请求,需要设置 withCredentials 为 true
  2. 对于fetch 请求,需要设置 credentials 为 include

这样就能实现任意网站的跨域携带cookie的请求了

参考网址:

XHR对象中的withCredentials

fetch请求中的跨域和携带Cookies问题

Fetch API 教程

跨域资源共享 CORS 详解

posted @ 2022-07-06 11:14  进军的蜗牛  阅读(506)  评论(0编辑  收藏  举报