【问题标题】:How can I find the session Id when using express / connect and a session store?使用 express / connect 和会话存储时如何找到会话 ID?
【发布时间】:2012-03-06 16:28:23
【问题描述】:

如果用户已经登录并尝试在新实例中再次登录,我希望它注销另一个用户实例。我不希望同一个用户在我的应用程序上登录两次。

当前会话存储在 Redis 存储中,我正在使用 express / connect 来处理会话存储。可用于销毁会话的可用函数之一如下:

.destroy(sid, callback)

但是,我需要在调用 .destroy() 之前找到该会话 ID。在 Redis 中,用户名存储为会话的一部分。

问题:是否可以根据用户名查询Redis获取会话ID?

【问题讨论】:

    标签: node.js redis express


    【解决方案1】:

    req.sessionID 将为您提供会话的 ID,其中 req 是一个请求对象。

    【讨论】:

    • 为什么这不是公认的答案?对我很有用。谢谢!
    • 这对我不起作用。 req.sessionIDundefined。 NodeJS 9.x、express 4、express-session 1.15。
    • 使用 req.session.id
    【解决方案2】:

    对于最近的读者;

    Connect 中间件自版本 4 起不再包含在 Express 中。

    因此,为了让req.sessionID 工作,您必须执行以下操作:

    1. 确保您的 package.json 中有 cookie-parser abd express-session 模块。如果未添加,请添加它们:
    npm install express-session --save
    npm install cookie-parser --save
    
    1. 在您的app.js 文件中要求它们时请注意顺序并添加所需的配置参数。
    var cookieParser = require('cookie-parser');
    var session = require('express-session')
    app.use(cookieParser());
    app.use(session({
        secret: '34SDgsdgspxxxxxxxdfsG', // just a long random string
        resave: false,
        saveUninitialized: true
    }));
    
    1. 现在您应该使用req.sessionIDreq.session.id

    【讨论】:

    • cookie-parser 在 1.5.0 中被弃用了 express-session(参见 github.com/expressjs/session 的自述文件)。事实上,cookie-parser 现在会产生副作用。
    【解决方案3】:

    将SID与帐号一起存储,当用户登录时在用户帐号的数据库验证过程中调用.destroy(sid, fn),然后将数据库中的SID更新为用户当前的SID。

    在我使用 MongoDB 的情况下,我就是这样做的:

    app.post('/login', function(req, res)
    {
      var sid = req.sessionID;
      var username = req.body.user;
      var password = req.body.pass;
    
      users.findOne({username : username, password : password}, function(err, result)
      { 
        ...
        sessionStore.destroy(result.session, function(){
           ...
           users.update({_id: result._id}, {$set:{"session" : sid}});
           ...
        }
        ...
      }
    }
    

    【讨论】:

      【解决方案4】:

      问题:是否可以根据用户名查询Redis获取会话ID?

      没有。 redis中的会话密钥不是以用户名命名的。

      这里有一个想法:当一个已经登录的用户尝试再次登录时,你看不到,在你的应用程序中,要么立即销毁旧会话,要么不允许他们再次登录?

      【讨论】:

        猜你喜欢
        • 2021-10-20
        • 1970-01-01
        • 1970-01-01
        • 2019-10-21
        • 2012-04-28
        • 2012-09-09
        • 1970-01-01
        • 1970-01-01
        • 2020-05-31
        相关资源
        最近更新 更多