【发布时间】:2016-07-13 06:53:44
【问题描述】:
我正在尝试与 express.js 和 socket.io 聊天。 目前,我聊天中的用户可以在同一个浏览器上打开多个标签,并且可以在所有这些标签上聊天。这意味着同一个客户可以同时与几个人聊天。我想阻止这种行为。
我想阻止客户每次都连接聊天:
1) 客户端在同一个浏览器的不同标签页上工作
2) 客户端打开不同的浏览器并在它们上工作
我该怎么做? 谢谢!
【问题讨论】:
我正在尝试与 express.js 和 socket.io 聊天。 目前,我聊天中的用户可以在同一个浏览器上打开多个标签,并且可以在所有这些标签上聊天。这意味着同一个客户可以同时与几个人聊天。我想阻止这种行为。
我想阻止客户每次都连接聊天:
1) 客户端在同一个浏览器的不同标签页上工作
2) 客户端打开不同的浏览器并在它们上工作
我该怎么做? 谢谢!
【问题讨论】:
您可以使用 cookie 来识别特定浏览器,从而从同一浏览器的不同选项卡中检测到同一用户。在第一次连接(socket.io 或快速请求)时,您设置一个唯一的 cookie 标识符,然后在后续连接上,您检查该唯一的 cookie 标识符是否已在使用中。您必须在您的特定应用程序中定义“使用中”的含义。对于 socket.io 连接,这要容易一些,因为这意味着当前已经有一个活动连接。对于 Express 请求,这有点困难,因为请求是临时性的,因此您必须决定如何区分不同选项卡与仅导航到新页面的一个选项卡(这是特定于应用程序的操作方式)。
为了检测多个浏览器,您必须进行用户身份验证,并且假设用户没有创建多个帐户,或者拥有某种系统来防止同一用户创建多个帐户。然后,您可以在 cookie 中使用帐户身份验证凭据,就像在前面的示例中一样,来判断该用户的会话是否已被使用。
【讨论】:
socket.handshake.address 来获取客户端的 IP 地址,我们可以在每次通过来自同一台机器的套接字打开连接时检测到该客户端。