2012-03-09 25 views
2

我想創建一個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

回答

0

你用相同的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

3

如果您希望在整個頁面刷新過程中保持連接狀態,請將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