4

您好我正在尝试将聊天构建到应用程序中。我想知道的是,当用户注销网站时,我还如何销毁与该会话关联的 socket.io 握手,以便用户在注销时无法从另一个选项卡发送消息。

如果有任何帮助,我正在使用 expressjs。

4

2 回答 2

7

好吧,以防有人发现这个并想知道我确实想通了。您可以访问套接字断开功能。我有用户 id 和他们的套接字 id 的对象,所以当有人注销时,我打电话给

app.get("/logout", function(req,res){
  //do other logging out stuff
  sockets.disconnectUser(req.session.user_id);
}

// Disconnect User function
sockets.disconnectUser = function(user_id){
  sockets.socket(users[user_id]).disconnect();
}
于 2012-09-14T04:18:24.103 回答
3

socket.io 对象包含有关所有连接的套接字和每个套接字的 sessionID 的信息。因此,可以遍历连接的套接字并断开与正在注销的 sessionID 关联的套接字。在这种方法中,无需手动跟踪用户和套接字 ID。

使用 socket.io@2.2.0、express@4.17.1 和 express-session@1.16.2 测试的示例代码。

const SocketIO = require('socket.io');

let sio = new SocketIO;

app.get('/logout', function(req, res) {
  //do other logging out stuff
  logoutSocketsIO(req.sessionID);
});


// Iterate through all connected sockets and close those which are associated
// with the given sessionID
// Note: One sessionID can have multiple sockets (e.g. many browser tabs)
function logoutSocketsIO(sessionID) {    
  let connections = sio.sockets.connected;
  for(let c in connections) {
    let socketSessionID = connections[c].conn.request.sessionID;
    if(sessionID === socketSessionID) {
      connections[c].disconnect();
    }
  }
}
于 2019-08-27T06:10:56.617 回答