9

多くのサイト (銀行の Web サイトなど) - セッションが期限切れになる前に、ログアウト + 1 分間の警告を実装します (20 分)。

(このトピックはあまり議論されていません - 見られる唯一の質問は、asp.net メンバーシップの使用に関するものです - 私は使用しません)

各ユーザーはsession["lastActionTime"]

このセッションは、次の場合に現在の時刻に更新されます:

  • ページが読み込まれました
  • Ajax リクエストが実行されました (ユーザーの操作により)

今 - ページが読み込まれると、セッション値を設定します。(19:00としましょう)

また、すべての ajax リクエストに対して (私のサイトはポストバックを作成しません - ajax jquery のみ) -IRequiresSessionStateセッションを現在の時刻に更新する ASHX ハンドラーを使用します。

私はこのようなものを使用します:

jQuery(document).ajaxStart(function(){
    gotoHandlerAndUpdateSessionTime();
})

ここで、警告メッセージの前の 1 分間の部分 (「セッションの有効期限が切れようとしています」):

すべての ajax リターン イベントまたはpage loadイベント - 私はjavascriptsetIntervalでアクティブ化します:[sessionTime-1]分 (20-1=19)。(そしてもちろん - すべての前の setIntervals をキャンセルします...)

イベント (setInterval) が発生したとき - 有効期限の 1 分前: (19 分)

警告 div を表示し、ユーザーはexitまたはを選択できますstay

質問 :

1) ユーザーが警告 div で何も押さなかった場合、( divを表示してから 1 分後に) どうすればログアウトできますか? div を表示するときに 1 分の setTimeout を開き、(何も押されていない場合) ログアウトする必要がありますか?

2)それは正しい方法ですか?

3) この奇妙な話全体にクッキーが必要ではないですか? :-)

(メンバーシップなし、またはフォーム認証でお願いします)。この質問には PHP のタグも付けています。これは、PHP プログラマーにも関連していることを知っているので、彼らの知識を聞きたいからです。

4

2 に答える 2

5

Royi、あなたの両方の質問に答えるには、YES と答えます。私はこれらを数回 (通常は Forms Auth を使用して) 作成しましたが、基本的には最初の警告を表示するためにカウントダウンするタイマーがあり、次にカウントダウンしてユーザーに X 秒の応答を与える別のタイマーがあります。私は通常、警告メッセージに X 秒のカウントダウンを付けて、残り時間を確認できるようにします。割り当てられた時間内に応答しない場合、セッションを破棄する Logout.ashx (またはその他のもの) への呼び出しが行われ、javascript によってログイン ページにリダイレクトされます。それが役立つことを願っています。

3 番目の質問については、セッションを追跡している限り、Cookie は必要ありません。javascript タイマーがカウントダウンしたら、PHP で session_destroy() を実行するか、C# で Session.Abandon() を実行します。

私のサイトの 1 つで使用しているコードを次に示します (最もきれいではないかもしれませんが、アイデアはわかります)。

var timeoutPolled = 0;
var timeoutSeconds = 10;
var countDownCounter = 61;
var timeoutBetweenPolls = 5000;
var stopCountDown = false;

function InitializePollTimer(timeoutMinutes) {
    timeoutSeconds = timeoutMinutes * 60;

    StartPollTimer();
}

function StartPollTimer() {
    setTimeout(PollForTimeout, timeoutBetweenPolls);
}

function PollForTimeout() {
    timeoutPolled++;

    if ((timeoutPolled * timeoutBetweenPolls) > 1 * (timeoutSeconds * 1000)) {
        $("#timeoutDialog").dialog({
            autoOpen: false,
            bgiframe: true,
            resizable: false,
            height: 250,
            draggable: false,
            modal: true,
            zindex: 99999999,
            position: 'top',   
            open: function(event, ui) { $(".ui-dialog-titlebar-close").hide(); },       
            buttons: {
                "Continue using Website?": function() {
                    StopCountDown();

                    $.ajax({
                        type: "GET",
                        url: "RefreshSession.aspx",
                        cache: false
                    });

                    $(this).dialog("close");

                    timeoutPolled = 0;
                    StartPollTimer();
                },
                "Logout": function() {
                    Logout();
                }
            }
        });

        $("#timeoutDialog").dialog("open");

        countDownCounter = 61;

        CountDown();
    }
    else {
        StartPollTimer();
    }
}

function CountDown() {
    if (stopCountDown) {
        stopCountDown = false;
    }
    else {
        countDownCounter--;
        $("#countdownTimer").html(countDownCounter);

        if (countDownCounter > 0) {
            setTimeout(CountDown, 950);
        }
        else {
            Logout();
        }
    }
}

function StopCountDown() {
    stopCountDown = true;
}

function Logout() {
    window.location.href = 'Logout.aspx';
}
于 2012-10-02T18:07:51.237 に答える
1

あなたがまだ知らないことは何も言わないかもしれませんが、とにかくここに私の2セントがあります-

警告ボタンを押さないユーザーには、次の2つの領域があります。(1)現在画面に表示されている情報(2)ブロックされている詳細情報の追加リクエスト-最初に、javascriptタイマーは、そうでない場合はLoggedOutページに転送する必要があります警告ダイアログをクリックしたという肯定的な結果によってキャンセルされ、2番目の場合、サーバー側のロジックは、ログインしているユーザーのコンテキストにあるかどうか、現在の要求を確実にチェックする必要があります。

Cookieに関しては、セッション状態のデフォルト設定を変更していない場合は、すでに使用しているようです。これは.ASPNETと呼ばれていると思いますが、プロキシツールで確認できるのは間違いかもしれません。

于 2012-10-02T18:31:59.073 に答える