【问题标题】:Meteor: Allow only one client instance per userMeteor:每个用户只允许一个客户端实例
【发布时间】:2017-05-16 09:38:26
【问题描述】:

有没有办法阻止用户在两个标签页或浏览器中打开 Meteor 网站?

我正在尝试在 Meteor 中创建纸牌游戏,如果用户尝试在另一个选项卡或浏览器中打开页面,我想“捕捉”并警告他另一个客户端实例已经打开并且可能给他/她在所有情况下都可以选择注销,等等。

我已经用谷歌搜索过了,但没有运气。

【问题讨论】:

    标签: meteor


    【解决方案1】:

    如果用户需要登录:

    • 将连接连同用户 ID 一起保存到 Connections 集合。 (或个人资料本身的 roomId,具体取决于您的架构)
    • 断开连接时删除连接
    • 在每个新连接上,查看用户 ID 是否已存在于 Connections 集合中

    如果用户不必登录:

    • 将连接保存到 Connections 集合(连同用户 IP)
    • 断开连接时删除连接
    • 在每个新连接上,查看 IP 地址是否已存在于 Connections 集合中

    一个在野外使用 onConnection 的例子(注意我并没有禁止多个连接,但这只是另外 5 行代码):https://github.com/mattkrick/react-tac-toe/blob/master/server/gameState.jsx#L13

    文档(即如何获取ip地址):http://docs.meteor.com/#/full/meteor_onconnection

    【讨论】:

    • IP够不够?如果他们共享路由器或类似的东西,用户就不能潜在地拥有相同的IP吗?我使用了您的建议并将其与下面 Michael 建议的 mizzao:user-status 结合起来,它可以很好地保存/删除 Connections 集合。我现在想弄清楚如何强制第二个连接注销并转到一个特殊的解释页面?
    • 您不会有来自 2 个唯一设备的 IP 冲突(极少见的例外是 ipv4 空间不足,或使用集线器将数据包复制到所有设备)。可能发生的情况是同一设备访问服务器两次(例如打开 2 个选项卡)。如果发生这种情况,只需遵循要点 #3。检查表中的 IP 地址。如果存在,则重定向到解释页面并返回。
    • 是的,我知道我应该遵循#3,我只是不知道该怎么做……如何从 Meteor.onConnection 服务器事件重定向客户端……但我正在尝试我认为应该做的事情......
    • 取决于您使用的路由器,如果您使用的话。我喜欢 redux-simple-router,但由于 flowrouter 是事实上的标准,它会类似于:FlowRouter.go('/multi-login-error');github.com/kadirahq/…
    • 是的,我也有同样的想法 :) 我在路由器中创建了一个 isDuplicate 方法,添加了这个检查,它就像一个魅力,对于两个选项卡,都转到“重复”页面,然后关闭一个选项卡后,另一个选项卡将返回应用程序 :) 我喜欢这个东西 :D 谢谢伙计!
    【解决方案2】:

    有一个非常方便的包用于跨设备跟踪 IP 地址和会话:mizzao:user-status。这会在用户文档(您需要将其发布到客户端)中添加一个密钥,详细说明他们的连接、它们是否处于活动状态、IP 地址,甚至是用户代理。您甚至可以观察此键的更改,以从第一个会话中检测用户还连接了第二个会话,反之亦然。

    【讨论】:

    • 是的,我已经在使用该软件包来处理在线用户,但是,它只显示“在线:true”,如果用户只是打开另一个选项卡或另一个浏览器,IP 是相同的, online 标志保持为真,只有 lastLogin 日期发生变化......如果他只是刷新页面,这可能会改变......所以,我的问题是此时检查其他的“online:true”标志是否知道这是双重连接还是只是刷新?
    • @Michel:我恳请您说明 Predrag 在上述评论中提出的问题。我想确保只为用户打开一个连接,因此它必须禁止我在其他选项卡或其他浏览器上打开站点。有什么建议吗?
    • 在服务器上查看UserStatus 集合 - 每个活动连接都有一个文档。您可以在登录 UserStatus.events.on("connectionLogin",.... 时实现回调,以搜索当前用户的 UserStatus 集合。如果您不止一次找到他/她,请采取行动。
    • @MichelFloyd:你所说的“如果你不止一次找到他/她然后采取行动”到底是什么意思。我该如何计算它们?
    • @MichelFloyd:知道了!我猜你的意思是我在下面发布的一段代码。
    【解决方案3】:

    正如 MichelFloyd 在上述聊天中所建议的那样。我按照他的指示尝试了以下内容。

    使用添加包

    $meteor add mizzao:user-status

    代码:

    Accounts.onLogin(function(user){
      UserStatus.events.on("connectionLogin", function(fields) {
        $count = UserStatus.connections.find({userId : fields.userId}).count();
        console.log('Total log ins : ' + $count);
      });
    });
    
    1. 当我打开多个正在登录的浏览器时,计数继续增加,当我一个一个关闭浏览器时,计数继续减少。
    2. 您可以使用此计数来监控登录用户的数量。

    您可以follow here查看已解决的整个场景。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 2023-03-09
      • 2012-06-02
      • 2020-03-01
      • 1970-01-01
      • 2015-11-03
      • 2014-10-11
      相关资源
      最近更新 更多