在每次遇到跨域问题,再设置后端跨域配置的时候都会重新在笔记中查找,所以没在这里总结一下各种框架的跨域配置。
nodejs
设置配置。
- 这里需要注意的是Access-Control-Allow-Origin不能是*号。 这样浏览器就不会拦截服务器设置的cookie了。
- 因为设置允许携带cookie之后那么请求头Access-Control-Allow-Origin的值就不能设置为*,所以要另外指向一个。
// 设置允许跨域的源 res.setHeader("Access-Control-Allow-Origin",req.headers.origin); // 设置cookie允许跨域 res.setHeader("Access-Control-Allow-Credentials", true); // 设置可以跨域的请求方法 res.setHeader("Access-Control-Request-Method", "PUT,POST,GET,DELETE,OPTIONS");
前端需要设置cookie跨域设置。请求头中设置withCredentials: true
。这里默认情况下在跨域请求,浏览器是不带 cookie 的。但是我们可以通过设置 withCredentials 来进行传递 cookie。
egg.js
启用插件
// plugin.js exports.cors = { enable: true, package: 'egg-cors' }
设置配置
// config.default.js config.security = { csrf: { enable: false }, // 设置跨域白名单 domainWhiteList: [ 'http://localhost:8080', 'http://127.0.0.1:8080', ], }; config.cors = { credentials: true, // 开启认证//允许Cook可以跨域credentials allowMethods: "GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS" };
可以自己手动设置请求origin通过
// config/config.default.js exports.cors = { origin: function ({ req }) { const { origin } = req.headers; // 配置允许访问白名单 const whiteList = [ 'http://localhost:7001', 'http://127.0.0.1:7001', ]; if (whiteList.includes(origin)) { return origin; } }, credentials: true, // 开启认证//允许Cook可以跨域credentials allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH' };
express
通过插件完成
// 引入跨域插件 const cors = require('cors'); // 解决跨域 app.use(cors()); // 手动覆盖cors跨域默认设置 const whitelist = ['http://127.0.0.1:8080', 'http://localhost:8080'] const corsOptions = { origin: function (origin, callback) { if (whitelist.indexOf(origin) !== -1) { callback(null, true) } else { callback(new Error('Not allowed by CORS')) } }, credentials: true } app.use(cors(corsOptions));
通过手动配置中间件
app.all("*", (req, res, next) => { res.header("Access-Control-Allow-Origin", req.headers.origin); res.header("Access-Control-Allow-Credentials", true); // ++ 新增 // 设置可以跨域的请求方法 res.header("Access-Control-Request-Method", "PUT,POST,GET,DELETE,OPTIONS"); next(); });
koa
通过插件
const cors = require('koa2-cors'); const app = new Koa(); app.use(cors()); // 或者自己配置各个头的值。 app.use(cors({ origin: function(ctx) { if (ctx.url === '/test') { return "*"; } return ctx.headers.origin; }, credentials: true, allowMethods: ['GET', 'POST', 'DELETE'] }));
通过手动配置中间件
app.use(async (ctx, next)=> { ctx.set('Access-Control-Allow-Origin', ctx.headers.origin); ctx.set('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS'); });