4

ユーザーがログアウト ボタンをクリックしたときの Web ページで、MongoDB に保存されているユーザー セッションをクリアする JavaScript 関数があります。それは正常に動作します。

また、ユーザーがブラウザを閉じたときにユーザー セッションをクリアしたいと考えています。私が直面している問題は次のとおりです。ユーザーが更新アイコンをクリックすると、ログアウト機能が呼び出されます。ブラウザが閉じられたときにのみこの関数が呼び出されるようにします。

ページの更新時にこの関数が呼び出されないようにすることはできますか?

ここでの私のロジックは、ブラウザーが閉じられたときにセッションをクリーンアップすることです。MongoDB 上のセッションを削除しています。セッションを管理するより良い方法はありますか?

var isRefresh = false;
$(window).keydown(function (event) {
    if (event.keyCode == 116) { // User presses F5 to refresh
        refresh = true;
    }
});

// Calls the logout function when you close the browser thus cleans the session data.
var windowsCloseEventListener = window.attachEvent || window.addEventListener;
var chkForBrowserCloseEvents = window.attachEvent ? 'onbeforeunload' : 'beforeunload'; /// make IE7, IE8 compitable
windowsCloseEventListener(chkForBrowserCloseEvents, function (e) { // For >=IE7, Chrome, Firefox
    if (!isRefresh) {
        $scope.logout();
    }
});
4

6 に答える 6

2

セッションをより適切に管理し、ユーザーがブラウザの更新を押すことを回避するには、次のことを行う必要があります。

  • ウィンドウを閉じたときのログアウト機能を削除します。
  • ユーザーが一定時間非アクティブな場合にセッションをクリアする InActivity モニターをクライアントとサーバーに実装します。そのため、ユーザーがブラウザを閉じても、MongoDB のセッションは、サーバーがクリアするまでしばらく持続します。
  • クライアントからサーバーへのキープアライブ ping を実装し、ユーザーがページ上でアクティブな場合、設定された時間間隔ごとにサーバーに ping を送信します。ネットワーク トラフィックを減らすために、AJAX または RESTful API を使用してサーバーが呼び出されるたびに、キープアライブを再スケジュールできます。
  • ブラウザーのユーザー セッションをローカル ストレージに保存して、ブラウザーの更新時にセッションを再読み込みできるようにします。

この InActivity モニターは、出発点として適しています。https://github.com/HackedByChinese/ng-idle/blob/develop/src/angular-idle.js . 私の角度プロジェクトで上記のすべてを行いました。それが役立つことを願っています。

于 2014-11-06T15:13:31.403 に答える
2

私の知る限り、ブラウザが閉じているかどうかを実際にテストすることはできません。ウィンドウ (またはタブ) が閉じているかどうかのみをテストできます。もちろん、ページの更新が発生しない限り、通常はこれで十分です。これは、ウィンドウまたはタブ内の Web ページを閉じることと再度開くことの両方としてカウントされるためです。必要なのは、ブラウザーのページ更新ボタンをクリックするためのイベント ハンドラーですが、そのようなものが存在するかどうかはわかりません。ここに何かがあります:

「このページから移動してもよろしいですか?」を表示する方法 いつ変更がコミットされますか?

そしてまた

Browser close イベントと Page Refresh の処理

ページ更新イベント ハンドラーについて何かを見つけようとして遭遇したことの 1 つは、「ローカル ストレージ」を使用するという概念です。on-before-unload ハンドラーの一部として、タイムスタンプ付きの小さなデータ項目をローカル ストレージに入れることができます。サーバーで一種のタイマーをアクティブにし、その時間が経過するのを待ってからセッションを消去します。ページが読み込まれたら、そのデータ項目のローカル ストレージをテストします。それが存在し、タイムスタンプがごく最近のものである場合、ページが更新されたことを認識し、それを知っていることに基づいて適切な処理を実行できます。たとえば、AJAX メッセージをサーバーに送信して、セッションをまだ消去しないように指示するなどです。

于 2014-10-27T18:30:53.423 に答える
1

セッションの有効期限が切れる Cookie を使用すると機能するはずです。

于 2014-11-05T15:10:58.453 に答える
0

この状況を処理するには、「onbeforeunload」イベントを使用できます。

$wnd.onbeforeunload = function(e) {

        var logoutClicked = callSomeFunctionToGetIfLogoutButtonIsClicked();
        if (!logoutClicked) {
            return "Some message";
        }
        return;
    }
于 2014-11-06T18:50:33.127 に答える
0

WindowEventHandlers.onbeforeunload

window.onbeforeunload = function(e) {
  return 'Dialog text here.';
};

この例は、addEventListener メソッドと attachEvent メソッドが onbeforeunload イベントに使用できないことを示しています (Google Chrome と Safari を除く)。

 if (window.addEventListener) {  // all browsers except IE before version 9
            window.addEventListener ("beforeunload", OnBeforeUnLoad, false);
        }
        else {
            if (window.attachEvent) {   // IE before version 9
                window.attachEvent ("onbeforeunload", OnBeforeUnLoad);
            }
        }

            // the OnBeforeUnLoad method will only be called in Google Chrome and Safari
        function OnBeforeUnLoad () {
            return "All data that you have entered will be lost!";
        }
于 2014-11-04T19:58:10.277 に答える