Node.js express会话被另一个并行会话覆盖



我们使用express会话库来处理请求会话。一个会话有时会被另一个并行会话覆盖。

例如,客户端a访问我们的应用程序并生成会话#a。之后,另一个客户端B创建

会话#B有人有解决类似问题的经验吗?

我的部分源代码附在下面:用TypeScript编写。会话配置在sess.ts中定义。我使用的存储是express oracle会话

评估

exports.configSession = () => {
let oracledb = require('oracledb');
let session = require('express-session');
let oracleDbStore = require('express-oracle-session')(session);
let sessOpts = {
checkExpirationInterval: 60000,
createDatabaseTable: true,
schema: {
tableName: 'ldap_sessions'
}
};
return new Promise((resolve, reject) => {
oracledb.getConnection('oracle_db', (err, conn) => {
if (err) {
return reject(err.message);
}
let sessionStore = new oracleDbStore(sessOpts, conn);
let sessConfig = {
secret: 'ldap secret',
resave: true,
saveUninitialized: true, 
rolling: true, 
cookie : {
httpOnly: false,
maxAge: 1000 * 60 * 60 * 24
store: sessionStore
};
return resolve(session(sessConfig));}
)});

};

服务器.ts

let configSess = require('./sess');
let cookieParser = require('cookie-parser');
let bodyParser = require('body-parser');
configSess.configSession().then((sess) => {
app.use(sess);
startServer();
});

好吧,你说你在使用express会话。它使用浏览器中的cookie来跟踪客户端。因此,我所知道的客户端A和客户端B将会话混淆的唯一方法是,它们是否在同一个浏览器中。如果是这样的话,这是按预期进行的。每个浏览器都有一个会话。如果在一个窗口中创建会话,然后在另一个窗口创建另一个会话,则第二个会话的cookie将覆盖第一个窗口的cookie,第二个窗口中的刷新将在第二个时段进行。这就是express会话的工作方式。

如果您没有为两个客户端使用相同的浏览器,那么您的express会话服务器实现中存在严重错误,我们必须查看您的服务器端代码才能进一步帮助解决此问题。

如果您想在同一浏览器中有两个单独的会话,用于单独的目的(例如一个用于管理员登录,一个用于用户登录(,那么您可以在这里看到:如何在express js中管理多个会话。但是,这并不是说你可以有两个独立的客户端,每个客户端都有相同类型的会话和在同一浏览器中运行的独立会话。我不认为这是expresssession所支持的。要做到这一点,你可能需要使用cookie以外的东西来跟踪会话密钥(也许每个URL中都有旧的?sessionid=xxxxx,但它有自己的一系列问题,这就是为什么它很少被使用的原因(。

我在本地服务器中遇到了同样的问题。我使用了两种不同的浏览器chrome和firefox进行测试。但每当我刷新任何一个浏览器时,客户端的会话都会被当前用户会话覆盖。我也在同一个本地网络上使用了移动浏览器来检查问题。然后我阅读了快速会话文档快速会话文档,发现了我的问题。我将会话数据存储在一个全局变量中。这就造成了问题。每当客户端刷新浏览器或重新登录时,变量数据都会被覆盖。我使用了req.session.user而不是gloabal变量。它解决了这个问题。

我使用了req.session.user而不是全局变量。它解决了这个问题。

最新更新