Nodejs Session 问题(express-session)
Nodejs Session 问题(express-session)
场景:用户登录后,同时请求 A,B,C 三个接口(并发); A 接口是获取用户的权限,同时我在服务器存了一份到 req.session 中,用于后续请求校验(防止多个用户绕过菜单请求)。
现象:A 接口虽然存了数据,但是后续请求发现 req.session 中没有权限数据了。
暂时处理方式:同时请求 A,B,C 改为先请求 A,再在回调中请求 B,C 接口,目前这样请求后续请求可以正常获取到 req.session ;
ps 思路(不知道对不对):Express 多个请求处理,之前的 req.session 是否会被请求 B,C 的覆盖掉?!有相关资料可以提供吗?
代码都没有,谁知道你怎么写。
你的 session 是存哪的
直接存在内存里面,req.session.permission 方式
肯定了,服务器都还没把处理好的数据保存了,你就去读取,哪里读得到~~~~
同时请求 A,B,C 接口
A 接口存到 session,“但是后续请求发现 req.session 中没有权限数据” 这个后续 是 B 和 C 么?
如果是 B 和 C,那么 A,B,C 是同时请求的,A 写入权限的时候,大概率,B 和 C 已经过了读取 req.session 的时机,你读不到。
express A 接口 做的 权限读取,判断,以及存储到 req.session 应该做成中间件, 每个接口都需要经过一遍这个中间件的处理,而不是 A 接口 读权限,存权限,A 接口要做的事情,其实只有一件事,把 req.session 里面的 session 输出
不只是 B、C,后续的请求都获取不到
业务量多的话,还是要考虑有一个专门的认证服务
关于Node.js中使用express-session
管理会话(Session)的问题,以下是一些常见问题的解决方案和示例代码。
首先,确保你已经安装了express
和express-session
:
npm install express express-session
接下来,在你的Node.js应用中设置会话中间件。以下是一个基本的示例:
const express = require('express');
const session = require('express-session');
const app = express();
// 配置会话中间件
app.use(session({
secret: 'your_secret_key', // 用于签名会话ID cookie的密钥
resave: false, // 强制会话保存,即使它没有被修改
saveUninitialized: true, // 强制将未初始化的会话保存到存储中
cookie: { secure: false } // 注意:在生产环境中应设置为true,并配置HTTPS
}));
app.get('/', (req, res) => {
if (req.session.views) {
req.session.views++;
res.send(`You have visited this page ${req.session.views} times`);
} else {
req.session.views = 1;
res.send('Welcome to the session demo. Refresh!');
}
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
在这个示例中,我们创建了一个简单的Express应用,并使用express-session
中间件来管理会话。每次访问根路径时,会话中的views
计数器都会递增。
请注意,在生产环境中,你应该将cookie.secure
设置为true
,并确保你的应用通过HTTPS提供服务,以保护会话数据不被窃取。此外,考虑使用更持久的会话存储(如Redis)来提高性能和可靠性。