我们使用express-session库来处理请求会话。一个会话有时会被另一个并行会话覆盖。
例如,客户A 访问我们的应用并生成会话#A 。之后,另一个客户B 创建会话#B 。然后,客户端A刷新相同的应用程序,并发现其会话已更改为会话#B。换句话说,会话#A已由会话#B取代。
有人有解决类似问题的经验吗?
我的部分源代码附在下面:用TypeScript编写。会话配置在 sess.ts 中定义。我正在使用的商店是 express-oracle-session 。
sess.ts
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));}
)});
};
server.ts
let configSess = require('./sess');
let cookieParser = require('cookie-parser');
let bodyParser = require('body-parser');
configSess.configSession().then((sess) => {
app.use(sess);
startServer();
});
答案 0 :(得分:1)
好吧,您说您正在使用快速会话。它使用浏览器中的cookie来跟踪客户端。因此,我知道客户端A和客户端B混合会话的唯一方法是它们是否在同一浏览器中。如果是这样,那将按预期工作。每个浏览器获得一个会话。如果您在一个窗口中创建一个会话,然后在另一个窗口中创建另一个会话,则第二个会话的cookie将覆盖第一个窗口的cookie,而第二个窗口中的刷新将在第二个会话中进行。这就是快递会议的工作方式。
如果两个客户端都没有使用相同的浏览器,则您在Express-Session的服务器实现中存在严重问题,我们将不得不查看服务器端代码以进一步解决问题。
如果您想在同一浏览器中有两个单独的会话,以实现单独的目的(例如,一个用于管理员登录,一个用于用户登录),那么您可以在此处看到:{{3} }。但是,事实并非如此,您可以拥有两个单独的客户端,每个客户端具有相同的会话类型,并且每个单独的会话在同一浏览器中运行。我不认为这是Express-Session支持的。为此,您可能必须使用cookie以外的其他方法来跟踪会话密钥(也许每个URL中都使用旧的?sessionid=xxxxx
,但这有其自身的一系列问题,这就是为什么很少使用任何问题)更多)。