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

Node.js express会话被另一个并行会话覆盖,node.js,express-session,Node.js,Express Session,我们使用express会话库来处理请求会话。一个会话有时会被另一个并行会话覆盖 例如,客户端a访问我们的应用程序并生成会话a。之后,另一个客户端B创建会话#B。然后客户端A刷新同一应用程序并发现其会话被更改为会话B。换句话说,会话A已被会话B替换 是否有人有解决类似问题的经验 我的部分源代码附在下面:用TypeScript编写。会话配置在sess.ts中定义。我使用的存储是express oracle session sess.ts exports.configSession = () =>

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

例如,客户端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));}
    )});
let configSess = require('./sess');
let cookieParser = require('cookie-parser');
let bodyParser = require('body-parser');

configSess.configSession().then((sess) => {
    app.use(sess);
    startServer();
});
})

server.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));}
    )});
let configSess = require('./sess');
let cookieParser = require('cookie-parser');
let bodyParser = require('body-parser');

configSess.configSession().then((sess) => {
    app.use(sess);
    startServer();
});

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

如果两个客户端使用的浏览器不相同,则express session的服务器实现中存在严重错误,我们必须查看您的服务器端代码以进一步帮助解决此问题


如果您希望在同一浏览器中有两个单独的会话用于单独的目的(例如,一个用于管理员登录,另一个用于用户登录),那么您可以在此处看到:。但是,这并不是说您可以有两个单独的客户端,每个客户端具有相同类型的会话,并且在同一浏览器中运行单独的会话。我认为ExpressSession不支持这一点。要做到这一点,您可能需要使用Cookie以外的其他工具来跟踪会话密钥(可能每个URL中都有旧的
?sessionid=xxxxx
,但这有其自身的一整套问题,这就是为什么很少再使用它的原因).

测试提示-匿名/私有模式与非匿名/非私有窗口有单独的会话。@slebetman-是的,因为匿名模式跟踪一组单独的cookie,以避免您的常规cookie被匿名模式的cookie污染,或者任何以匿名模式访问的站点都可以访问您的常规cookie。这些匿名cookie也是临时的(例如,当您离开匿名模式时,不会持续存储)。是的。这就是它对开发者如此有用的原因。我以前在好几份工作中都遇到过类似的抱怨——通常是来自新手QA或开发人员。归根结底,就是教QA或开发人员如何使用隐姓埋名模式和几种可选浏览器来正确测试多个帐户。到目前为止,它从未要求对代码进行实际更改,因为测试要求!=现实世界usage@slebetman-是的,我使用多个浏览器是有原因的。虚拟机在这方面也很有用。@jfriend00我没有使用相同的浏览器进行测试。我(A)和另一位同事(B)在不同的计算机上测试应用程序。我还在帖子中添加了源代码。非常感谢您的建议。