我正在使用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小时编码,我不知道如何解决这个问题。
我可以在会话中使用/传递,但这只是愚蠢的。如果必须这样做,为什么附加会话存在。
答案 0 :(得分:4)
<强>更新强>
在尝试计算这个rid plus + 1等之后,我注意到rid正在改变存在,在名单更改的名单上发送的消息上的消息,所以我在每个上面做了一个XMLHttpRequest来记住新的rid in session。出于某种原因,本地存储有时不起作用。
现在我一直都在摆脱最新状态。
我想我得到了这个。问题在于摆脱和存在。
1)首先,你必须从你的日志中弄清楚你的摆脱是增加还是减少。
我的减少了一个。所以我从我的Chat.connection.rid
中减去-12)在我的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;