如果用户已经登录并尝试在新实例中再次登录,我希望它能够注销其他用户实例。我不希望同一个用户在我的应用程序上登录两次。
目前会话存储在Redis存储中,我使用express / connect来处理会话存储。可用于销毁会话的其中一个功能如下:
.destroy(sid, callback)
但是我需要在调用.destroy()之前找到该会话ID。在Redis中,用户名存储为会话的一部分。
问题:是否可以查询Redis以获取基于用户名的会话ID?
答案 0 :(得分:69)
req.sessionID
将为您提供会话ID,其中req是请求对象。
答案 1 :(得分:17)
对于最近的读者;
自版本4以来,Express中不包含连接中间件。
因此,为了req.sessionID
工作,您必须执行以下操作:
cookie-parser
个abd express-session
个模块。如果没有添加,请添加它们:npm install express-session --save npm install cookie-parser --save
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 }));
req.sessionID
和req.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中的会话密钥不是以用户名命名的。
以下是一个想法:当一个已经登录的用户再次尝试登录时,你不能在你的应用程序中看到它,并且要么立即销毁旧会话,要么不允许他们再次登录?