gpt4 book ai didi

java - cometd : Multiple tabs for online-users management creating false online-status

转载 作者:行者123 更新时间:2023-12-01 11:18:36 34 4
gpt4 key购买 nike

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

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

我们如何解决这个问题?有什么想法、建议。我想过使用 boolean 标志,并与 IP 地址结合,在覆盖通知之前将对其进行检查,但它存在通知过时的问题。

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

代码:

 @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);
}

欢迎任何想法。多谢。 :-)

最佳答案

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

您特定 userName 的在线状态因此是所有 ServerSession 的函数这个特定的userName 。因此,它是来自 userName 的映射。到在线状态列表。

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

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

计算bob的在线状态您只需浏览每个 ServerSession 的所有在线状态即可如果至少有一个 online如果都是 afk 那么就在线了然后它远离键盘,依此类推。

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

每当您收到 ServerSession 的在线状态更改时,您更新服务器端数据结构,然后重新计算所有 ServerSession 的在线状态。 s 代表该用户,这就是您发送给其他用户的内容。

关于java - cometd : Multiple tabs for online-users management creating false online-status,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31512310/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com