我正在使用Socket.io
和Express
来制作聊天应用程序。
聊天是匿名的,我不想在任何数据库中保存任何内容。我可以考虑检查用户的IP地址并阻止从同一IP地址再次登录,但我认为这不是一个好主意,因为人们在线使用共享IP地址。另一件事是会话ID,但即使用户从浏览器中的其他选项卡登录,这也会发生变化。没有使用任何数据库,有没有简单的方法可以做到这一点?最好不安装任何其他包/ lib?
答案 0 :(得分:2)
express.session中间件使用基于cookie的会话,默认情况下只存储在内存中,而不是存储在数据库中。如果用户打开新选项卡,则基于cookie的会话不会更改。其他地方提到This article作为使用socket.io快速会话的一个很好的参考。一般情况下,您只需要在socket.io(sio.set('authorization', authCallback)
)中进行授权时检查会话,然而您的应用程序可以使用户连接到正确的房间。
更新(更具体地说明如何使用Cookie阻止用户)
// Var to save if the user is connected or not
var connectedUsers = [];
sio.authorization(function(data, next){
var cookie = data.headers.cookie && data.headers.cookie.match(/auth=([^;]+)/);
cookie = cookie && cookie[1] || null;
if (cookie && connectedUsers.indexOf(cookie)){
next(null, false);
}
else {
connectedUsers.push(cookie);
next(null, cookie);
}
});
// Somewhere else
socket.on('disconnect', function (data) {
var cookie = data.headers.cookie && data.headers.cookie.match(/auth=([^;]+)/);
cookie = cookie && cookie[1] || null;
if(cookie) {
connectedUsers.splice(connectedUsers.indexOf(cookie), 1);
}
});
这是获取cookie值的一种非常基本的方法,但它对我有用。请注意,我没有时间尝试这个解决方案,但原则应该有效。
答案 1 :(得分:2)
这就是我为我所做的工作。这与安德烈亚斯的回答没什么不同:
var MemoryStore = express.session.MemoryStore;
var sessionStore = new MemoryStore();
app.configure(function() {
//app.use(express.logger());
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.session({
store: sessionStore,
secret: 'someSecret',
key: 'cookie.sid', maxAge: null }));
});
var sessionID;
var sessionArray = new Array();
var sessionIDs = new Array();
在我的“登录”功能中,我有:
sessionArray = socket.handshake.headers.cookie.split(" ");
sessionID = sessionArray[0].split("express.sid=").pop();
if(sessionIDs.indexOf(sessionID) > -1) {
io.sockets.socket(socket.id).emit('preventlogin', true);
}
else {
sessionIDs.push(sessionID);
// and do the rest
}
在'断开'我做:
var ind = sessionIDs.indexOf(sessionID);
sessionIDs.splice(ind, 1);