0

私はsymfony2を使っていくつかのアプリを構築しています。そのアプリにはチャットアプリがあります。チャットで添付セッションを使用しています。

1)ログイン時に、イベントリスナーを起動して、ログインからユーザー/パスをキャッチし、openfireサーバーに接続して、sidを取得して取り除きます。

2)その後、そのデータをセッションに保存しているので、チャットしているすべてのページで後で使用できます。

ページの再読み込み/更新時に問題が発生します。

私の推測では、url:7070/httpd-bind への ajax リクエストが取り消され、strophe が openfire サーバーに終了を送信するためです。Bu 私はスタンザを終了する場所を見つけることができません。

ページのアンロード時に同期を使用するように strophe.js にパッチを適用しましたが、これも機能しません。

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

Chat.connection.disconnect();

これに対する解決策を提案してください。私は 10 時間のコーディングを行っていますが、これを解決する方法がわかりません。

セッションでユーザー/パスをソートできますが、それはばかげています。私がそれをしなければならないのなら、なぜ接続されたセッションが存在するのですか。

4

1 に答える 1

4

アップデート

このridプラス+1などについて理解しようとした後、ridがプレゼンス、名簿の変更時に名簿に送信されたメッセージで変化していることに気付いたので、セッションで新しいridを記憶するためにそれぞれにXMLHttpRequestを作成しました。何らかの理由で、ローカルストレージが機能する場合と機能しない場合があります。

今、私はいつも最新の状態にしています。


私はこれを得たと思います。問題は除去と存在にありました。

1) まず、ログから、rid が増加しているか減少しているかを把握する必要があります。

私のは1つ減っていました。だから私は Chat.connection.rid から -1 を引きます

2) openfire ログで、ページの更新時に利用不可のステータスを送信していることがわかったので、window.unload 関数を変更してプレゼンスをオンラインに送信しました。N

今、私は何百万回もページを更新していますが、切断されることはありません。

ここで、非 HTML ブラウザの localStorage への connection.rid を記憶する方法を理解する必要があります。

デバッグ モードで 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;
于 2013-10-26T21:27:06.920 に答える