React使用Fetch发请求时express-session每次生成新会话如何解决
问题修复方案
- 调整中间件加载顺序
必须先加载cors中间件,再加载session中间件,否则跨域凭证配置未生效时session就会提前初始化,导致每次请求生成新会话:// 正确加载顺序 app.use(cors(corsOptions)) app.use(session(/* 你的session配置 */)) - 补全session配置的cookie属性
你当前的session配置没有显式设置cookie属性,本地开发环境补充如下配置即可:
注意app.use(session({ secret: 'sec12', resave: false, saveUninitialized: false, // 新增cookie配置 cookie: { httpOnly: true, secure: false, // 本地http环境设为false,生产环境用https时改为true sameSite: 'lax', maxAge: 9 * 60 * 60 * 1000 // 和MongoStore的ttl保持一致 }, store: MongoStore.create({ mongoUrl: keys.mongodb.dbURI, autoRemove: 'native', ttl: 9 * 60 * 60, mongoOptions: { useNewUrlParser: true, useUnifiedTopology: true } }) }));saveUninitialized设为false时,只有首次请求中修改了session的值(比如req.session.user = 用户信息),session才会被持久化到存储中,未修改的会话不会被保存,下次请求自然识别为新会话。
生产环境如果前后端属于跨站场景,需要将cookie的sameSite改为none,同时secure设为true,且后端必须走HTTPS协议。 - 调整cors配置的预检参数
将preflightContinue改为false,让cors中间件自动处理OPTIONS预检请求,避免预检请求触发session初始化:var corsOptions = { origin: 'http://localhost:3000', methods: ['GET', 'POST'], optionsSuccessStatus: 200, credentials:true, preflightContinue: false, // 修改为false allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With', 'Accept'] } - 检查前端所有请求配置
确保所有GET/POST请求的fetch参数都显式设置了credentials: 'include',漏加该参数的请求不会携带cookie,后端会识别为新访客生成新会话。
内容的提问来源于stack exchange,提问作者Jomar Tinga
相关产品推荐
相关产品推荐

