【问题标题】:reset the XMPP connection if the page gets refreshed如果页面刷新,则重置 XMPP 连接
【发布时间】:2012-03-26 20:00:19
【问题描述】:

我正在尝试使用 javascript 与我的 ejabberd 服务器创建与 XMPP 的 strophe 连接,我能够在页面加载时建立连接,并且能够在单击断开按钮时断开连接。

现在的问题是,连接是有效的,如果用户不小心刷新了页面,那么我的 javascript 正在尝试再次连接,并且我得到了响应。 (只是因为之前的连接可能还活着)

<body xmlns='http://jabber.org/protocol/httpbind'>
    <failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
            <not-authorized/>
    </failure>
</body>

一段时间后,如果我再次刷新页面,则连接将成功建立,所以如果页面被意外刷新,我该如何重置连接,以便用户获得无缝连接。

【问题讨论】:

  • 您使用什么身份验证机制或后端?
  • 身份验证在 ejabberd 中实现,因此它是 DIGEST-MD5 PLAIN

标签: javascript xmpp ejabberd strophe xmppframework


【解决方案1】:

如果您想让连接在页面刷新后仍然存在,请将 jidsidrid 变量以及您需要的任何其他状态保留在 sessionStorage 之类的东西中。然后,您可以使用attach() 恢复 XMPP 会话。

【讨论】:

  • 好吧,由于我的前端是 javascript,所以我无法管理会话,我所能做的就是在查询字符串中传递这些属性,但最终查询字符串会变大
  • 我的意思是,您可以尝试使用 HTML5 localStorage 机制保存这些 ID。
  • localStorage 将工作,因为它跨选项卡/窗口持久存在。 sessionStorage 会起作用,但在他解决页面重新加载问题之前不会。
【解决方案2】:

您使用相同的 JID 登录,这是不允许的。您需要为您的 JID 设置一个随机资源以确保没有冲突。因此,您应该使用 JID user@domain/some_random_resource,而不是使用 JID user@domain 记录用户。

原则上您也可以收听onbeforeunload 并在那里断开连接。这不适用于基于 webkit 的浏览器,但适用于其他浏览器。

【讨论】:

  • 如果我使用一些随机资源,我将无法跟踪 ejabberd 上的在线用户数量,因为每次都会在服务器上创建一个新用户,不是吗?
  • 不,不是每次都创建一个新用户。同一用户的新资源登录。旧资源将在几秒钟后自动断开连接,正如我提到的,您可以(并且应该)通过监听 onbeforeunload 断开它们。
  • 但如果存在资源冲突,您不会收到 SASL 错误。
  • @Zash 正如我所暗示的,这是一个有根据的猜测。如果他可以登录一次,但重新加载页面后无法登录,我那是因为 BOSH 拒绝了同一个 JID 上的第二次连接。 BOSH 经理并不总是提供信息丰富的信息。当然我可能完全错了,只是想不出别的。
猜你喜欢
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 2011-11-14
  • 2019-07-27
  • 2017-05-04
  • 1970-01-01
  • 2015-03-28
  • 2013-07-12
相关资源
最近更新 更多