已登录状态下打开新标签仍跳转Node-RED登录页(会话问题)
Node-RED 同浏览器新标签会话保持问题解决方案
1. 修正会话Cookie属性配置
问题核心大概率是Cookie的作用域或属性限制了新标签页的会话共享,需在settings.js中调整session的cookie参数:
adminAuth: { type: "credentials", session: { secret: "your-custom-secret", // 替换为你的自定义密钥 cookie: { path: "/", // 确保Cookie作用于整个站点路径 sameSite: "Lax", // 允许新标签页请求携带Cookie maxAge: 86400000, // 会话有效期,按需调整(示例为1天) httpOnly: true // 保留安全属性,防止前端篡改 }, // 其他session基础配置 }, // 你的用户认证逻辑 }
2. 给登录路由添加会话校验逻辑
修改/api/login的处理逻辑,每次访问先检查是否已有有效会话,若有直接跳转仪表盘:
// 自定义中间件:校验已有会话 function checkValidSession(req, res, next) { if (req.session?.user) { // 已登录状态,直接跳转至Node-RED仪表盘 res.redirect("/"); return; } next(); } // 将校验中间件挂载到登录路由 app.get("/api/login", checkValidSession, (req, res) => { // 原有显示登录页面的逻辑 });
3. 解决多会话覆盖问题
默认内存会话存储可能会覆盖同用户的现有会话,建议改用数据库存储(如connect-mongo),并保留多会话条目:
const MongoStore = require('connect-mongo'); adminAuth: { type: "credentials", session: { secret: "your-custom-secret", store: MongoStore.create({ mongoUrl: 'mongodb://localhost/your-db-name' // 替换为你的MongoDB地址 }), cookie: { /* 沿用之前的Cookie配置 */ }, rolling: true, // 每次请求自动更新会话有效期 resave: false, saveUninitialized: false }, // 用户认证逻辑... }
4. 验证步骤
- 登录后,打开浏览器开发者工具
Application > Cookies,确认Cookie的Path为/、SameSite为Lax - 新标签页访问
/api/login,查看请求头的Cookie字段是否包含会话ID - 检查数据库会话集合,确认同一用户的多个会话条目均存在且未被覆盖
内容的提问来源于stack exchange,提问作者Logu
相关产品推荐
相关产品推荐

