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

Javascript strophe.js和openfire谁在页面重新加载时终止连接?,javascript,php,ajax,session,symfony,Javascript,Php,Ajax,Session,Symfony,我正在使用symfony2构建一些应用程序。在那个应用程序中,我有一个聊天应用程序。我正在聊天中使用附加会话 1) 在登录时,我启动事件侦听器来捕获登录时的用户/密码,连接到openfire服务器并获取sid和rid 2) 之后,我将这些数据存储在会话中,以便以后在我聊天的每个页面上使用它们 重新加载/刷新页面时出现问题 我猜这是因为对url:7070/httpd绑定的ajax请求被取消,strophe将terminate发送到openfire服务器。但我找不到任何地方终止节 我已经修补了str

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

1) 在登录时,我启动事件侦听器来捕获登录时的用户/密码,连接到openfire服务器并获取sid和rid

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

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

我猜这是因为对url:7070/httpd绑定的ajax请求被取消,strophe将terminate发送到openfire服务器。但我找不到任何地方终止节

我已经修补了strophe.js以在页面卸载时使用sync,但这同样不起作用

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

Chat.connection.disconnect();
请建议解决方案,我在10小时编码,我不知道如何解决这个问题


我可以在会话中忽略用户/通过,但这太愚蠢了。如果必须这样做,为什么会存在附加会话。

更新

在尝试了解这个rid plus+1等之后,我注意到rid在状态上、在花名册上发送的消息上、在花名册上的更改上都发生了变化,所以我对每个rid都做了XMLHttpRequest,以便在会话中记住新的rid。由于某些原因,localstorage有时工作,有时不工作

现在我一直在更新


我想我明白了。问题就在眼前

1) 首先,您必须从日志中找出您的rid是在增加还是在减少

我的工资下降了一倍。所以我从Chat.connection.rid中减去-1

2) 在我的openfire日志中,我发现我在页面刷新时发送了不可用状态 因此,我更改了window.unload函数,将状态发送到online。N

现在,我刷新页面数百万次,我从未断开连接

现在,我只需要找出如何为非HTML浏览器记住connection.rid到localStorage

要在调试模式下启动openfire,只需添加./openfire.sh-debug。然后您将能够使用debug.log中的所有内容

这对我很有帮助。若这对你们来说是个恶作剧,请+1并接受答案

注销时不要忘记终止会话:)

更新

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


            }
        })
    }
}

更新

在尝试了解这个rid plus+1等之后,我注意到rid在状态上、在花名册上发送的消息上、在花名册上的更改上都发生了变化,所以我对每个rid都做了XMLHttpRequest,以便在会话中记住新的rid。由于某些原因,localstorage有时工作,有时不工作

现在我一直在更新


我想我明白了。问题就在眼前

1) 首先,您必须从日志中找出您的rid是在增加还是在减少

我的工资下降了一倍。所以我从Chat.connection.rid中减去-1

2) 在我的openfire日志中,我发现我在页面刷新时发送了不可用状态 因此,我更改了window.unload函数,将状态发送到online。N

现在,我刷新页面数百万次,我从未断开连接

现在,我只需要找出如何为非HTML浏览器记住connection.rid到localStorage

要在调试模式下启动openfire,只需添加./openfire.sh-debug。然后您将能够使用debug.log中的所有内容

这对我很有帮助。若这对你们来说是个恶作剧,请+1并接受答案

注销时不要忘记终止会话:)

更新

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


            }
        })
    }
}

嗨@pregmatch,我自己也有这个问题,我找不到任何解决办法。我的RID增加了1,你是如何将你的RID附加到现有连接上的,在你的例子中是-1?页面卸载时,您是如何发送在线状态的?我把我的RID、SID储存在一块饼干里。请帮助。@nino,如果您需要进一步的帮助,请告诉我,如果这对您有效,请接受or+1回答。@pregmatch我的代码也面临类似的问题……尽管我仍然无法解决。请你看看这个问题,看看你能不能帮上忙。嗨@pregmatch,我自己也有这个问题,我找不到任何解决办法。我的RID增加了1,你是如何将你的RID附加到现有连接上的,在你的例子中是-1?页面卸载时,您是如何发送在线状态的?我把我的RID、SID储存在一块饼干里。请帮助。@nino,如果您需要进一步的帮助,请告诉我,如果这对您有效,请接受or+1回答。@pregmatch我的代码也面临类似的问题……尽管我仍然无法解决。请你看看这个问题,看看你能不能帮上忙。