2013-10-26 27 views
0

我正在使用symfony2來構建一些應用程序。在那個應用程序中我有聊天應用程序我在聊天中使用附加的會話。strophe.js和openfire在頁面重新加載時終止連接?

1)登錄時,我啓動事件監聽器來捕獲登錄用戶/通行證,連接到openfire服務器並獲取sid和清除。

2)之後,我將該數據存儲在會話中,以便稍後在聊天的每個頁面上使用它們。

重新加載/刷新頁面時發生問題。

我的猜測這是因爲ajax請求url:7070/httpd-bind被取消strophe發送終止到openfire服務器。布我找不到任何地方終止節。

我已經修補了strophe.js以在頁面卸載時使用同步,但再次無法正常工作。

Chat.connection.flush(); 
Chat.connection.sync = true; // Switch to using synchronous requests since this is typically called onUnload. 

Chat.connection.disconnect(); 

請建議解決方案,我在10小時的編碼,我不知道如何解決這個問題。

我可以在用戶/通過會話,但這只是愚蠢的。爲什麼附加會話存在,如果我必須這樣做。

回答

4

UPDATE

試圖弄清楚這個擺脫加+ 1等我注意到,擺脫正在改變的存在,對消息的消息在名冊變化對名冊發送所以我做的每一個XMLHttpRequest記住後在會議中新的擺脫。由於某些原因,本地存儲有時候有時候不工作。

現在我已經擺脫了所有的時間。


我想我得到了這個。問題擺脫和存在。

1)首先你必須從你的日誌中弄清楚如果你的日誌正在增加或減少。

我正在減少一個。所以我-1。減去從我Chat.connection.rid

2)在我的Openfire日誌我想通了,我是在頁面刷新 不能發送的狀態,所以我改變了我的window.unload函數發送存在網上。 N

現在我刷新頁面萬次,我從來沒有斷開連接。

現在我只需要弄清楚如何記住connection.rid到非HTML瀏覽器的localStorage。

要在調試模式下啓動openfire,只需添加./openfire.sh -debug。那麼你將能夠在debug.log中查看所有內容

這對我來說確實有竅門。如果這是對你的詭計,請+1並接受答案。

不要忘記在註銷:)

UPDATE終止會話

這是我在window.onunload功能

window.onunload = function(ev){ 

    var initialPresence = $pres().c('show').t("cao").up().c('status').t("sad"); 

     Chat.connection.send(initialPresence); 
     store.set('session_rid', parseInt(Chat.connection.rid)-1); 

     //save rooster contacts state 
     var contacts = document.getElementById('records').getElementsByTagName('li'); 
     var id_value; 
     var class_value; 
     var status; 
     var el; 
     for(i= 0; i < contacts.length; i++){ 

      el = contacts[i].getElementsByClassName("mood")[0]; 
      status = el.textContent || el.innerText; 
      Array.prototype.slice.call(contacts[i].attributes).forEach(function(item) { 

      if(item.name == "id"){ 
       id_value = item.value; 
      } 
      if(item.name == "class"){ 
       class_value = item.value; 
      } 
      store.set('user'+i, { id: id_value, class_name: class_value, status : status }); 

      }); 

     } 
     Chat.disconnect(); 
} 

這是我上的window.onload功能

window.onload = function(){ 
    if(store.get("session_rid")){ 

     var obj; 
     var id; 
     var class_name; 
     var status; 

     store.forEach(function(val, key) { 
      if(val !== "session_rid"){ 

       setTimeout(function(){ 
       obj = eval(key); 
       id = obj.id; 
       class_name = obj.class_name; 
       status = obj.status; 
        if(document.getElementById(id)){ 
         document.getElementById(id).className = class_name; 
         document.getElementById(id).getElementsByClassName("mood")[0].innerHTML = "<span>"+status+"</span>"; 
        } 
       }, 1000); 


      } 
     }) 
    } 
} 

這是工作g對我來說。我使用store.js來存儲數據,因此它可以在IE上工作。

我使用了附加的會話。

//json is from ajax call on some php script that has started attached session on user login 
var obj = JSON.parse(json); 
    connection = new Strophe.Connection(BOSH_SERVICE); 
    connection.attach(obj.fulljid, 
         obj.sid, 
         (store.get("session_rid") ? store.get("session_rid"):obj.rid),  
         justDoIt); 
    full_jid = obj.fulljid; 
+1

嗨@pregmatch,我自己有這個問題,我找不到任何解決方案。我的RID正在增加1,您是如何將您的RID附加到現有連接上的?如何在頁面卸載時發送在線狀態?我將我的RID,SID存儲到cookie中。請幫忙。 – leeshin

+0

嗨@nino,答案更新代碼示例。 – pregmatch

+0

@nino,告訴我你是否需要進一步的幫助,並接受或+1的答案,如果這是爲你工作。 – pregmatch