【问题标题】:Cometd : Multiple tabs for online-users management creating false online-statusCometd:用于在线用户管理的多个选项卡创建虚假在线状态
【发布时间】:2015-07-20 08:52:00
【问题描述】:

我正在开发一个基于 Spring-MVC 的网络应用程序,该应用程序使用 Cometd 进行聊天。为了实时管理哪个用户在线,我们会在用户在线时发送通知。因此,当窗口关闭时,不会出现通知,并且在 30 秒后确定用户离线或无法访问。

现在,当用户使用多个浏览器时,就会出现问题。让我们现在保留2。因此,10 分钟后,我们将用户状态设置为“远离键盘”(AFK)。但是如果用户在一个浏览器中在线,那么我们会得到一个闪烁的状态,因为浏览器处于“空闲模式”几秒钟,我们会得到一个 AFK,并且从活动机器我们得到一个“可用”状态。

我们如何解决这个问题?任何想法,建议。我想用一个布尔标志,加上IP地址,在覆盖通知之前会检查它,但它有一个过时通知的问题。

这是我向所有听众(用户的朋友)发送在线通知的代码。

代码:

 @Listener(value = "/service/online")
    public void OnlineNotifications(ServerSession remote, ServerMessage.Mutable message) {
        Person sender = this.personService.getCurrentlyAuthenticatedUser();
        Map<String, Object> input = message.getDataAsMap();
        String onlineStatus = (String) input.get("status");
        Map<String, Object> output = new HashMap<>();
        output.put("status", onlineStatus);
        output.put("id", sender.getId());
        ServerChannel serverChannel = bayeux.createChannelIfAbsent("/online/" + sender.getId()).getReference();
        serverChannel.setPersistent(true);
        serverChannel.publish(serverSession, output);
    }

欢迎任何想法。非常感谢。 :-)

【问题讨论】:

    标签: java spring comet cometd


    【解决方案1】:

    您的应用程序可以轻松地将多个设备与同一个userName 关联起来。 您可以通过SecurityPolicy 执行此操作,只需将userName 字符串与List&lt;ServerSession&gt; 或任何更适合您的情况的数据结构相关联。

    因此,您对特定userName 的在线状态是该特定userName 的所有ServerSessions 的函数。 因此,它是从userName 到在线状态列表的映射。

    如果您想象用户bob 从两个浏览器登录,其在线状态的映射可以是:

    "bob" -> ["afk", "online"]
    

    要计算bob 的在线状态,您只需运行每个ServerSession 的所有在线状态,如果至少有一个online,则它在线,如果所有afk,则它远离键盘等等。

    您可以通过多种方式实现此逻辑(例如,将在线状态存储为 ServerSession 属性、使用不同的数据结构、缓存每个用户的在线状态等),但您明白了。

    每当您从一个ServerSession 获得在线状态更改时,您都会更新您的服务器端数据结构,然后从所有ServerSessions 为该用户重新计算在线状态,这就是您发送给另一个的用户。

    【讨论】:

    • 这有帮助,但我实现了自己的数据结构,似乎更方便满足要求。非常感谢。 :-)
    • 嗨,我在运行 Cometd 的控制台聊天代码时遇到问题,因为库方法(来自 BayeuxClient)失败。你能检查一下这个帖子吗?编辑:stackoverflow.com/questions/33668915/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 2012-08-23
    • 2019-01-16
    • 1970-01-01
    • 2017-10-17
    • 2018-03-16
    相关资源
    最近更新 更多