如何在使用express / connect和会话存储时找到会话ID?

时间:2012-02-15 10:21:35

标签: node.js redis express

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

目前会话存储在Redis存储中,我使用express / connect来处理会话存储。可用于销毁会话的其中一个功能如下:

.destroy(sid, callback)

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

问题:是否可以查询Redis以获取基于用户名的会话ID?

4 个答案:

答案 0 :(得分:69)

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

答案 1 :(得分:17)

对于最近的读者;

自版本4以来,Express中不包含连接中间件。

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

  1. 确保package.json中有cookie-parser个abd express-session个模块。如果没有添加,请添加它们:
  2. npm install express-session --save
    npm install cookie-parser --save
    
    1. app.js文件中要求订单并添加所需的配置参数时,请注意订单。
    2. 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

答案 2 :(得分:15)

当用户在数据库验证用户帐户调用.destroy(sid,fn)期间登录时,使用该帐户存储SID,然后使用用户的当前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}});
       ...
    }
    ...
  }
}

答案 3 :(得分:0)

  

问题:是否可以查询Redis以获取基于用户名的会话ID?

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

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

相关问题