strophe.js和openfire谁在页面重新加载时终止连接?

时间:2013-10-26 20:20:09

标签: javascript php ajax session symfony

我正在使用symfony2来构建一些应用程序。在那个应用程序我有聊天应用程序。我在聊天中使用附加会话。

1)登录时,我启动事件监听器以从登录中捕获用户/传递,连接到openfire服务器并获取sid和rid。

2)之后我将这些数据存储在会话中,以便稍后我可以在我聊天的每一页上使用它们。

重新加载/刷新页面时出现问题。

我的猜测这是因为对url:7070 / httpd-bind的ajax请求被取消了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小时编码,我不知道如何解决这个问题。

我可以在会话中使用/传递,但这只是愚蠢的。如果必须这样做,为什么附加会话存在。

1 个答案:

答案 0 :(得分:4)

<强>更新

在尝试计算这个rid plus + 1等之后,我注意到rid正在改变存在,在名单更改的名单上发送的消息上的消息,所以我在每个上面做了一个XMLHttpRequest来记住新的rid in session。出于某种原因,本地存储有时不起作用。

现在我一直都在摆脱最新状态。


我想我得到了这个。问题在于摆脱和存在。

1)首先,你必须从你的日志中弄清楚你的摆脱是增加还是减少。

我的减少了一个。所以我从我的Chat.connection.rid

中减去-1

2)在我的openfire日志中,我发现我在页面刷新时发送了不可用的状态 所以我改变了我的window.unload功能,将在线状态发送到网上。 Ñ

现在我翻了几百万次,我从来没有断线。

现在我只需要弄清楚如何记住非HTML浏览器的connection.rid到localStorage。

要在调试模式下启动openfire,只需添加./openfire.sh -debug即可。然后你就可以在debug.log中找到所有东西

这对我来说很有用。如果这对你有用,请+1并接受答案。

不要忘记在退出时终止会话:)

更新

这是我的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);


            }
        })
    }
}

这对我有用。我使用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;