我们有一个站点,我们使用 strophe.js 库和 ejabberd XMPP 服务器为其开发了一个聊天系统。我们使用由 PHP 启动的会话附件(使用内部库)。我们所做的是从 PHP 脚本中获取 RID 和 SID,然后使用 strophe 的会话附件。所述 RID 和 SID 存储在 cookie 上,并且每次更新 strophe.js 上的 RID 时都会更新 cookie 上的 RID 值。
这很好用,登录后我们会收到每个联系人的在线状态。这样做的问题是,当您转到站点上的另一个页面并使用上述 RID(我们使用 strophe 产生的增量值)和 SID 附加时,服务器将不再发送您的联系人的存在信息,而不是当您登录时。这导致我们的联系人区域即使在线,也完全不可见。只有当您(或您的联系人)退出聊天,然后再次登录时,它们才会在线显示(因为您将从 XMPP 服务器收到状态更新)。
我编写了一个解决方法,当从服务器接收到状态时,您的联系人的状态会保存在 cookie 中(所有在线联系人的 JID 都会保存在 cookie 中)。每次页面加载都会检查这个,如果设置了 cookie,它将被读取,并且 cookie 上的所有 JID 都将被标记为在线。这工作正常,但可能有一些更好的方法来解决这个问题,使用 XMPP 的默认行为。