使用 attach() 时 Strophe 中的 404(无效的 SID 值)
404 (Invalid SID value) in Strophe while using attach()
我在 google 中搜索过一些关于堆栈溢出的类似问题。但我没有得到任何解决方案。
基本上,我想在我的应用程序中保持跨网页的连接。为此,我正在使用 cookie。我将 SID 和 RID 存储在 cookie 中,并使用它们再次附加会话。
下面是我的代码。
this.openConnection = function(){
if (chatObj.connection != null) return;
var jid = chatObj.userName + '@' + chatObj.openfireDomainURL; // Bare JID
var sid = Cookies.get(chatObj.userName + '_sid'); // Session Identifier
var rid = Cookies.get(chatObj.userName + '_rid'); // Request Identifier
var connection = new Strophe.Connection(chatObj.xmppHttpBindURL);
chatObj.connection = connection;
if(chatObj.isEmpty(sid) && chatObj.isEmpty(rid)){
connection.connect(jid, chatObj.password, chatObj.onConnection);
} else {
// parseInt(rid,10) + 1
var rid = parseInt(rid) + parseInt(1);
connection.attach(jid, sid, rid, chatObj.onConnection);
}
};
this.onConnection = function(status) {
if (status === Strophe.Status.CONNECTED) {
chatObj.log("CONNECTED ");
//Cookies.set(chatObj.userName + '_sid', chatObj.connection.sid);
//Cookies.set(chatObj.userName + '_rid', chatObj.connection.rid);
jQuery(document).trigger('connected');
} else if (status === Strophe.Status.DISCONNECTED) {
jQuery(document).trigger('disconnected');
chatObj.log("DISCONNECTED ");
} else if (status === Strophe.Status.CONNFAIL) {
chatObj.log("CONNFAIL ");
} else if (status === Strophe.Status.AUTHENTICATING) {
chatObj.log("AUTHENTICATING ");
} else if (status === Strophe.Status.AUTHFAIL) {
chatObj.log("AUTHFAIL ");
} else if (status === Strophe.Status.ERROR) {
chatObj.log("ERROR ");
} else if (status === Strophe.Status.ATTACHED){
chatObj.log("ATTACHED ");
jQuery(document).trigger('connected');
} else if (status === Strophe.Status.CONNFAIL){
chatObj.log("CONNFAIL ");
}
};
$(window).unload(function() {
console.log("widows unload ");
if( chatObj.connection != null ){
console.log("set cookies ");
Cookies.set(chatObj.userName + '_sid', chatObj.connection.sid);
Cookies.set(chatObj.userName + '_rid', chatObj.connection.rid);
} else {
// Cookies.remove(chatObj.userName + '_sid');
// Cookies.remove(chatObj.userName + '_rid');
}
});
我尝试使用 windows 卸载但它不起作用。我仍然遇到同样的错误。
除了使用 attach()
方法之外,还有 restore
功能与 keepalive
选项结合使用:
var connection = new Strophe.Connection(chatObj.xmppHttpBindURL, {'keepalive': true});
...
try {
connection.restore(jid, onConnect);
} catch(e) {
if (e.name !== "StropheSessionError") { throw(e); }
}
参见:http://strophe.im/strophejs/doc/1.2.14/files/strophe-js.html#Strophe.Connection.restore
和
https://github.com/strophe/strophejs/blob/master/examples/restore.js
由于某些奇怪的原因,sid
和 rid
属性未定义,因此您可以通过以下方式检索它们:
var sid = chatObj.connection._proto.sid;
var rid = chatObj.connection._proto.rid;
另一种方法是直接从发送到连接覆盖 xmlOutput 函数的每个 XML 消息中检索它们:
connection.xmlOutput = function (e) {
rid = $(e).attr('rid');
sid = $(e).attr('sid');
};
我在连接到 XMPP 服务器时也遇到了同样的问题。
*
I was using Strophe version 1.2.2.
*
使用当前版本后,这个问题为我解决了。
我在 google 中搜索过一些关于堆栈溢出的类似问题。但我没有得到任何解决方案。
基本上,我想在我的应用程序中保持跨网页的连接。为此,我正在使用 cookie。我将 SID 和 RID 存储在 cookie 中,并使用它们再次附加会话。
下面是我的代码。
this.openConnection = function(){
if (chatObj.connection != null) return;
var jid = chatObj.userName + '@' + chatObj.openfireDomainURL; // Bare JID
var sid = Cookies.get(chatObj.userName + '_sid'); // Session Identifier
var rid = Cookies.get(chatObj.userName + '_rid'); // Request Identifier
var connection = new Strophe.Connection(chatObj.xmppHttpBindURL);
chatObj.connection = connection;
if(chatObj.isEmpty(sid) && chatObj.isEmpty(rid)){
connection.connect(jid, chatObj.password, chatObj.onConnection);
} else {
// parseInt(rid,10) + 1
var rid = parseInt(rid) + parseInt(1);
connection.attach(jid, sid, rid, chatObj.onConnection);
}
};
this.onConnection = function(status) {
if (status === Strophe.Status.CONNECTED) {
chatObj.log("CONNECTED ");
//Cookies.set(chatObj.userName + '_sid', chatObj.connection.sid);
//Cookies.set(chatObj.userName + '_rid', chatObj.connection.rid);
jQuery(document).trigger('connected');
} else if (status === Strophe.Status.DISCONNECTED) {
jQuery(document).trigger('disconnected');
chatObj.log("DISCONNECTED ");
} else if (status === Strophe.Status.CONNFAIL) {
chatObj.log("CONNFAIL ");
} else if (status === Strophe.Status.AUTHENTICATING) {
chatObj.log("AUTHENTICATING ");
} else if (status === Strophe.Status.AUTHFAIL) {
chatObj.log("AUTHFAIL ");
} else if (status === Strophe.Status.ERROR) {
chatObj.log("ERROR ");
} else if (status === Strophe.Status.ATTACHED){
chatObj.log("ATTACHED ");
jQuery(document).trigger('connected');
} else if (status === Strophe.Status.CONNFAIL){
chatObj.log("CONNFAIL ");
}
};
$(window).unload(function() {
console.log("widows unload ");
if( chatObj.connection != null ){
console.log("set cookies ");
Cookies.set(chatObj.userName + '_sid', chatObj.connection.sid);
Cookies.set(chatObj.userName + '_rid', chatObj.connection.rid);
} else {
// Cookies.remove(chatObj.userName + '_sid');
// Cookies.remove(chatObj.userName + '_rid');
}
});
我尝试使用 windows 卸载但它不起作用。我仍然遇到同样的错误。
除了使用 attach()
方法之外,还有 restore
功能与 keepalive
选项结合使用:
var connection = new Strophe.Connection(chatObj.xmppHttpBindURL, {'keepalive': true});
...
try {
connection.restore(jid, onConnect);
} catch(e) {
if (e.name !== "StropheSessionError") { throw(e); }
}
参见:http://strophe.im/strophejs/doc/1.2.14/files/strophe-js.html#Strophe.Connection.restore
和
https://github.com/strophe/strophejs/blob/master/examples/restore.js
由于某些奇怪的原因,sid
和 rid
属性未定义,因此您可以通过以下方式检索它们:
var sid = chatObj.connection._proto.sid;
var rid = chatObj.connection._proto.rid;
另一种方法是直接从发送到连接覆盖 xmlOutput 函数的每个 XML 消息中检索它们:
connection.xmlOutput = function (e) {
rid = $(e).attr('rid');
sid = $(e).attr('sid');
};
我在连接到 XMPP 服务器时也遇到了同样的问题。 *
I was using Strophe version 1.2.2.
*
使用当前版本后,这个问题为我解决了。