重置XMPP连接,如果页面被刷新

问题描述:

我想创建一个strophe连接与XMPP使用javascript与我的ejabberd服务器,我能够建立一个连接,当页面加载,并能断开连接点击断开按钮时。重置XMPP连接,如果页面被刷新

现在的问题是,连接是活着的,如果用户意外刷新页面,那么我的JavaScript正试图再次进行连接,并作出回应,我越来越。 (它只是因为以前的连接可能还活着)

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

,一段时间后,如果我刷新页面,然后再次连接将获得成功建立,所以我怎么能的情况下复位连接,如果该页面是意外刷新以便用户获得无缝连接。

+0

你使用了什么认证机制或后端? – Zash 2012-03-10 05:56:44

+0

身份验证在ejabberd中实现,所以它是DIGEST-MD5 PLAIN – Hunt 2012-03-10 14:09:13

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

同样作为一个原则问题,你也可以听onbeforeunload并在那里断开连接。这不适用于基于webkit的浏览器,但可以与其他浏览器一起使用。

+0

如果我使用一些随机资源,那么,我将无法申请在ejabberd上的在线用户数量,因为每次在服务器上创建新用户都不是它呢? – Hunt 2012-03-10 14:10:08

+0

不,每次都不会创建新用户。同一用户的新资源登录。旧资源将在几秒钟后自动断开连接,正如我所提到的,您可以(也应该)通过监听onbeforeunload断开连接。 – ggozad 2012-03-10 14:55:24

+0

但是,如果存在资源冲突,则不会收到SASL错误。 – Zash 2012-03-11 14:51:15

如果您希望在整个页面刷新过程中保持连接状态,请将jid,sidrid变量与您需要的任何其他状态保持一致,如sessionStorage。然后,您可以使用attach()恢复XMPP会话。

+0

那么,因为我的前端是JavaScript,所以我不管我可以管理会话的事情,我所能做的就是在查询字符串中传递这些属性,但是最终查询字符串会变大 – Hunt 2012-03-10 06:00:37

+0

我的意思是,您可以尝试保存这些ID与HTML5 [localStorage](http://dev.w3.org/html5/webstorage/#the-sessionstorage-attribute)机制。 – Zash 2012-03-10 06:55:28

+0

localStorage将* not *工作,因为它跨标签/窗口持久。 sessionStorage会工作,但不能解决他的页面重新加载问题。 – ggozad 2012-03-10 09:09:40