【问题标题】:how to detect the same client in socket.io如何在socket.io中检测到同一个客户端
【发布时间】:2016-07-13 06:53:44
【问题描述】:

我正在尝试与 express.js 和 socket.io 聊天。 目前,我聊天中的用户可以在同一个浏览器上打开多个标签,并且可以在所有这些标签上聊天。这意味着同一个客户可以同时与几个人聊天。我想阻止这种行为。

我想阻止客户每次都连接聊天:

1) 客户端在同一个浏览器的不同标签页上工作

2) 客户端打开不同的浏览器并在它们上工作

我该怎么做? 谢谢!

【问题讨论】:

    标签: express socket.io


    【解决方案1】:

    您可以使用 cookie 来识别特定浏览器,从而从同一浏览器的不同选项卡中检测到同一用户。在第一次连接(socket.io 或快速请求)时,您设置一个唯一的 cookie 标识符,然后在后续连接上,您检查该唯一的 cookie 标识符是否已在使用中。您必须在您的特定应用程序中定义“使用中”的含义。对于 socket.io 连接,这要容易一些,因为这意味着当前已经有一个活动连接。对于 Express 请求,这有点困难,因为请求是临时性的,因此您必须决定如何区分不同选项卡与仅导航到新页面的一个选项卡(这是特定于应用程序的操作方式)。

    为了检测多个浏览器,您必须进行用户身份验证,并且假设用户没有创建多个帐户,或者拥有某种系统来防止同一用户创建多个帐户。然后,您可以在 cookie 中使用帐户身份验证凭据,就像在前面的示例中一样,来判断该用户的会话是否已被使用。

    【讨论】:

    • 首先感谢您的帮助!!!对于第一种情况,您是对的 - cookie 或会话足以检测在同一浏览器上但在多个选项卡上工作的同一用户。但对于第二种情况,我不想在 moemt 提供用户身份验证。我看到一个聊天可以检测到在多个浏览器上工作的同一个客户端,并且这个聊天无需用户身份验证即可工作。我也想这样做。
    • 我想我找到了解决问题的方法。如果我们使用socket.handshake.address 来获取客户端的 IP 地址,我们可以在每次通过来自同一台机器的套接字打开连接时检测到该客户端。
    • @Emil - 由于代理和 NAT 以及专用网络上的用户,无法保证 IP 地址唯一对应于单个用户。由于我们家庭路由器中的 NAT,网站会将我家中的所有用户(都来自他们自己的计算机)视为相同的 IP 地址。对于来自公司的用户来说也是如此。因此,如果您只使用 IP 地址,您将错误地拒绝用户的第一次连接,因为同一专用网络上的其他人正在使用您的服务。
    猜你喜欢
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    相关资源
    最近更新 更多