跨站调用(CORS)一例
在我的一个环境中,有一个服务器A上运行着一些接口服务(多为POST的),需要通过登录认证才能使用,另有一个服务器B上有网页中的JS需要调用服务器A上的接口,为此,做了以下方案:
1 两服务器Session数据保存到共同的redis中,实现session共享
const cookieParser = require("cookie-parser");
const session = require("express-session");const { createClient } = require("redis");
const client = createClient({ url: jargs.sessionredis });
client.on("error", err => { logger.error("Redis连接出错"); errlog("Redis连接出错"); });
client.connect();
const { RedisStore } = require("connect-redis-session");app.use(session({name: "sessionapp",secret: jargs.appsecret,store: new RedisStore({ client }), saveUninitialized: false,resave: false,cookie: { domain:"mydomain.com",httpOnly: true, maxAge: jargs.sessionage }}));app.use(cookieParser("sessionapp"));
2 服务器B网页的JS请求访问服务器A接口采用fetch,带上Cookie
fetch("https://servera.mydomain.com/api", {method: 'POST',credentials: "include",body: JSON.stringify(data),headers: { 'content-type': 'application/json', responseType: "arraybuffer"}}).then(response => response.arrayBuffer()).then( abuffer=>{
...
3 服务器A需配置支持服务器B的跨站访问
app.all("*", (req, res, next)=>{res.header("Access-Control-Allow-Origin", "https://serverb.mydomain.com"); //跨站带Cookie的话,此处不能填*res.header("Access-Control-Allow-Headers", "Content-Type, Content-Length, Authorization, Accept, X-Requested-With,responseType");res.header("Access-Control-Allow-Methods", "PUT, POST, GET, DELETE, OPTIONS");//注意跨站访问的话,OPTIONS必须有,浏览器预检会调用res.header("Access-Control-Allow-Credentials", "true");if (req.method === "OPTIONS") { res.sendStatus(200); } else { next(); }
});
大体没有毛病,不少小坑需要注意,还是可以调通的。