【问题标题】:A Node.js express session is overwritten by another parallel sessionNode.js 快速会话被另一个并行会话覆盖
【发布时间】:2018-11-09 02:52:41
【问题描述】:

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

例如,Client A 访问我们的应用并生成 Session #A。之后,另一个 Client B 创建 Session #B。然后客户端 A 刷新同一个应用程序,发现它的会话被更改为会话 #B。换言之,Session #A 已被 Session #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();
});

【问题讨论】:

    标签: node.js express-session


    【解决方案1】:

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

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

    如果您希望在同一浏览器中拥有两个单独的会话以实现单独目的(例如,一个用于管理员登录,一个用于用户登录),那么您可以在此处查看:how to manage multiple session in express js。但是,这并不是说您可以拥有两个单独的客户端,每个客户端都具有相同类型的会话,并且单独的会话在同一浏览器中运行。我不认为这是 express-session 支持的东西。为此,您可能必须使用 cookie 以外的其他东西来跟踪会话密钥(可能是每个 URL 中的旧 ?sessionid=xxxxx,但这有其自身的一系列问题,这就是为什么它很少再使用的原因) .

    【讨论】:

    • 测试提示 - 隐身/私人模式与非隐身/非私人窗口有单独的会话。
    • @slebetman - 是的,因为隐身模式会跟踪一组单独的 cookie,以免您的常规 cookie 被隐身模式或任何以隐身模式访问的网站污染可以访问您的常规 cookie。这些隐身 cookie 也是临时的(例如,当您离开隐身模式时不会永久存储)。
    • 是的。这就是它对开发人员如此有用的原因。我以前在几份工作中都有过这样的抱怨——通常来自新手 QA 或开发人员。它总是归结为教 QA 或开发人员如何使用隐身模式和几种替代浏览器来正确测试多个帐户。到目前为止,它从未需要对代码进行实际更改,因为测试要求!= 实际使用情况
    • @slebetman - 是的,我拥有并使用多个浏览器是有原因的。虚拟机在这方面也很有用。
    • @jfriend00 我没有使用相同的浏览器进行测试。我 (A) 和另一位同事 (B) 在不同的计算机上测试应用程序。我还在帖子中添加了源代码。非常感谢任何建议。
    猜你喜欢
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 2012-01-20
    • 2021-09-23
    • 2014-07-23
    • 2011-06-25
    相关资源
    最近更新 更多