express+socket.io,如何限制一个用户只能登录一次,一个用户只有一个连接到socket.io
发布于 4个月前 作者 zemug 860 次浏览 来自 问答

服务端代码,有一个问题 handshakeData.username = username; 这个好像不起作用

var connectedUsers = [];

io.set('authorization', function (handshakeData, callback) {
  var signedCookies = require('express/node_modules/cookie').parse(handshakeData.headers.cookie);
  handshakeData.cookies = require('express/node_modules/connect/lib/utils').parseSignedCookies(signedCookies, settings.cookie_secret);
  sessionStore.get(handshakeData.cookies['connect.sid'], function(err, session) {
    if (err) {
      callback(err, false);
      return;
    }
    var username = session.user && session.user.name;
    handshakeData.username = username;  //这个好像不起作用
    console.log('authorization', username);
    console.dir(connectedUsers);
    if (connectedUsers.indexOf(username) !== -1) {
      //重复登录
      console.log('重复登录');
      callback('重复登录', false);
    } else {
      connectedUsers.push(username);
      callback(null, true);
    }
  });
  //callback(null, false);
});

io.of('/client').on('connection', function (socket) {
  socket.emit('agents', agents);
  socket.emit('rate', rate);
  //socket.handshake.username
  console.log('client connect:', socket.client.request.username);
  //client下线
  socket.on('disconnect', function() {
    console.log('disconnect', socket.client.request.username);//socket.handshake.username);
    connectedUsers.splice(connectedUsers.indexOf(socket.client.request.username), 1);
    });
});

客户端代码

var client = io.connect('/client');
// 下面代码参考官方文档,但没有收到连接失败端消息,请大家指正
client.on('connect_failed', function (reason) {
    console.log('unable to connect to namespace', reason);
});
4 回复

客户端链接的时候

     'force new connection': true,

这个值设置为false,每个客户端来的都是一个链接

请问你解决这个问题了吗? 我现在遇到session问题了,sokcet.io中的session好像与http中获取的req.session不一致

利用session来记录登录用户 已经登录的用户不让登录就行了 不过问题是socket.io中如何获取session啊 我和你遇到同样的问题了 不过我解决了重复登录问题 但是还没解决在socket.io中获取session的问题 望交流下 速回复我

@ddzjs 我上面到代码就可以获取session了, 我测试是,必须调用: io.set('authorization’, function (handshakeData, callback) {

回到顶部