javascript – 如何在使用Socket.IO时访问会话标识符?

我聊天,我需要管理独特的连接.我四处搜索,但我发现的解决方案似乎都被弃用了.

那么,我如何使用Socket.IO获得套接字的会话ID?

我正在使用Node.js,Express.jsSocket.IO.

解决方法

使用Socket.IO身份验证设置,并将Cookie传递给Express的cookie解析器中间件.解析cookie后,您可以获取客户端的会话ID,并从会话存储中获取关联的会话,无论是内存故事还是其他类型的存储.
// we need to use the same secret for Socket.IO and Express
var parseCookie = express.cookieParser(secret);
var store = /* your MemoryStore,RedisStore,etc */;

io.set('authorization',function(handshake,callback) {
  if (handshake.headers.cookie) {
    // pass a req,res,and next as if it were middleware
    parseCookie(handshake,null,function(err) {
      handshake.sessionID = handshake.signedCookies['connect.sid'];
      // or if you don't have signed cookies
      handshake.sessionID = handshake.cookies['connect.sid'];

      store.get(handshake.sessionID,function (err,session) {
        if (err || !session) {
          // if we cannot grab a session,turn down the connection
          callback('Session not found.',false);
        } else {
          // save the session data and accept the connection
          handshake.session = session;
          callback(null,true);
        }
      });
    });
  } else {
    return callback('No session.',false);
  }
  callback(null,true);
});

每次客户端尝试连接时,都会运行授权功能.它需要握手头cookie(handshake.headers.cookies),并将它们传递给express.cookieParser().然后,cookie解析器找到会话ID,然后在商店中搜索关联的会话.然后,我们将关联的会话存储到handshake.session中,因此我们可以像这样访问它:

app.get('/',function(req,res) {
  req.session.property = 'a value';
});

io.sockets.on('connection',function(socket) {
  var session = socket.handshake.session;
  session.property // a value
});

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...