【问题标题】:404 (Invalid SID value) in Strophe while using attach()使用 attach() 时 Strophe 中的 404(无效的 SID 值)
【发布时间】:2018-01-15 23:21:19
【问题描述】:

我在谷歌搜索过一些关于堆栈溢出的类似问题。但我没有得到任何解决方案。

基本上,我想在我的应用程序中跨网页保持连接。为此,我正在使用 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');
    }
});

404 Invalid SID value in Strophe while using attach()

我尝试使用 Windows 卸载,但它不起作用。我仍然遇到同样的错误。

【问题讨论】:

    标签: javascript xmpp openfire strophe


    【解决方案1】:

    除了使用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


    由于某些奇怪的原因,sidrid 属性未定义,因此您可以通过以下方式检索它们:

      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');
      };
    

    【讨论】:

    • 我确实得到了 sid 和 rid 值。即使那样它也不起作用。
    • 您在项目中使用的是哪个版本的 strophe.js?
    • 我使用的strophe版本是1.2.14
    • 您尝试恢复而不是附加方法吗? (见我更新的答案)
    • 那么,我根本不需要调用connect?
    【解决方案2】:

    我在连接到 XMPP 服务器时也遇到了同样的问题。 *

    我使用的是 Strophe 版本 1.2.2。

    *

    使用当前版本后,此问题已为我解决。

    【讨论】:

      猜你喜欢
      • 2015-11-10
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多