我正在使用SailsJS和Socket.IO 目前我需要知道用户的会话是否已过期 一旦用户的会话过期,我需要断开该用户的套接字连接。
一种方法是每隔30分钟使用CRON
并检查用户是否仍然登录。
有没有办法在不使用CRON
的情况下检查用户的会话是否仍然存在。
先谢谢
答案 0 :(得分:2)
幸运的是,Node是Javascript,Javascript使这种事情变得非常简单。您可以像常规ol'前端脚本一样使用setInterval
。因此,假设您的User
模型具有expiresOn
字段,您可以检查config/bootstrap.js
中的以下内容:
module.exports = function(cb) {
// Schedule disconnectExpiredUsers to run once a minute
setInterval(disconnectExpiredUsers, 60000);
// Function to loop through all expired users and disconnect them
function disconnectExpiredUsers() {
var now = new Date();
User.find({expiresOn: {'<': now}}).exec(function(err, expiredUsers) {
// Handle errors somehow
if (err) {
return console.log(err);
}
// Loop through expired users (lodash is globalized by Sails)
_.each(expiredUsers, function(expiredUser) {
// Since you're using resourceful pubsub (right???),
// we can get all of the instance's sockets easily
var sockets = User.subscribers(expiredUser);
// And we can send them a message
User.publishMessage(expiredUser, "Session expired, buddy!");
// And disconnect them, but use nextTick to make sure the messages
// go out first
process.nextTick(function() {
_.each(sockets, function(socket) {socket.disconnect();});
});
});
});
}
};
这也假设您使用Sails'resourceful pubsub订阅套接字到User
个实例;否则你必须自己跟踪连接套接字的ID。
答案 1 :(得分:0)
您可以通过向所有路线添加政策
来实现此目的只需将sessionAuth.js添加到策略文件夹
即可module.exports = function(req, res, next) { // If you are not using passport then set your own logic /*if (req.session.authenticated) { return next(); }*/ // if you are using passport then if(req.isAuthenticated()) { return next(); } //else // Write your code for socket disconnect // or send json res like this return res.json({msg:'You are not loggedin, Please Login !'}) };
现在转到config / policies.js
并将此政策应用于所有路线
module.exports.policies = { '*': 'sessionAuth' }