0

この jQuery コードを使用して、セッション タイムアウト ウィンドウ ( http://jsfiddle.net/xHEF9/515/ ) を表示します。問題は、ユーザーが timoutValue より長くページにとどまると、ウィンドウがポップアップすることです。

ユーザーがページで実行する各アクティビティでセッションをリセットする方法を見つける必要があります。

それについて何か助けていただければ幸いです。

私が使用するコードは次のとおりです。

<script type="text/javascript">        //<![CDATA[
         var timeout=<%#(int)HttpContext.Current.Session.Timeout%>*60*1000;
          //var timeout=2*60*1000;

         var uservar = "<%# Session["userID"]%>";
         $(window).load(function () {

             (function (a) {
                 jQuery.sessionTimeout = function (b) {
                     function f(a) {
                         switch (a) {
                             case "start":
                                 window.onbeforeunload = null;
                                 redirTimer = setTimeout(function () {
                                     window.location = d.redirUrl
                                 }, d.redirAfter - d.warnAfter);
                                 break;
                             case "stop":
                                 clearTimeout(redirTimer);
                                 break
                         }
                     }

                     function e(b) {
                         switch (b) {
                             case "start":
                                 //window.onbeforeunload = null;
                                 dialogTimer = setTimeout(function () {
                                     a("#sessionTimeout-dialog").dialog("open");
                                     f("start")
                                 }, d.warnAfter);
                                 break;
                             case "stop":
                                 clearTimeout(dialogTimer);
                                 break
                         }
                     }
                     var c = {

                         message: "Your session is about to expire.",
                         keepAliveUrl: "default.aspx",
                         redirUrl: "<%# Page.ResolveClientUrl("~/LogOut.aspx?user=")%>"+uservar,
                         logoutUrl: "<%# Page.ResolveClientUrl("~/LogOut.aspx?user=")%>"+uservar,
                        warnAfter: 9e5,
                        redirAfter: 12e5
                    };
                    var d = c;
                    if (b) {
                        var d = a.extend(c, b)
                    }
                    a("body").append('<div title="Session Timeout" id="sessionTimeout-dialog">' + d.message + "</div>");
                    a("#sessionTimeout-dialog").dialog({
                        autoOpen: false,
                        width: 400,
                        modal: true,
                        closeOnEscape: false,
                        open: function (b, c) {
                            a(".ui-dialog-titlebar-close").hide()
                        },
                        buttons: {
                            "Log Out Now": function () {
                                window.location = d.logoutUrl
                            },
                            "Stay Connected": function () {
                                //this event is triggered when the user tries to leave the page
                                window.onbeforeunload = confirmExit;
                                a(this).dialog("close");

                                a.ajax({
                                    type: "POST",
                                    url: d.keepAliveUrl
                                });
                                f("stop");
                                e("start")
                            }
                        }
                    });
                    e("start")
                }
            })(jQuery)
            $(document).ready(function () {

                $.sessionTimeout({
                    warnAfter: timeout-(60*1000)
                    ,redirAfter: timeout
                });
            });
        });//]]>  
</script>
4

1 に答える 1

3

つまり、ページで変数を使用し、キーの押下やマウスのクリックなどのアクティビティで変数を更新できます。アクティビティがあった場合は、サーバー セッションを維持するために ping を実行します。

記事全体を再作成するのではなく、ここでデモされている手法を見ることができます:ユーザーがフォーラムに投稿している間、ユーザーのセッションを維持する方法は?


編集:
あなたを助けるために、私はかなりの時間を費やして、あなたが借りたコードを取り、コードで何が起こっているのかをよりよく理解できるように、大幅に変更して再構築しました. これにより、さらに正常に更新できる可能性が向上します。最適化には時間をかけませんでしたが、うまくいくはずです。フィドルを更新したので、試してみてください:

http://jsfiddle.net/xHEF9/555/

また、以下の更新されたコードも含まれています。

var activityTimer, warningTimer, redirTimer;
var haveNewInput = false;
var inactivityParms = {
    warningMessage: "Your session is about to expire.",
    keepAliveUrl: "/keep-alive",
    redirUrl: "/timed-out",
    logoutUrl: "/log-out",
    activityCheckEvery: 3000, //  3 sec * 1000 ms
    warnAfter: 10000,         // 10 sec * 1000 ms
    redirAfter: 20000         // 20 sec * 1000 ms
};


// Function to check for keyboard input and reset timers if input is detected
function setActivityCheckTimer(activityCheckTimerAction) {
    switch (activityCheckTimerAction) {
        case "start":
            activityTimer = setInterval(
                function () {
                    if (haveNewInput == true) {
                        pingServerToKeepSessionAliveAndResetTimers();
                        haveNewInput = false;
                    }
                },
                inactivityParms.activityCheckEvery);
            break;
        case "stop":
            clearTimeout(activityTimer)
    }
}

function setWarningTimer(warningTimerAction) {
    switch (warningTimerAction) {
        case "start":
            warningTimer = setTimeout(
                function () {
                    $("#sessionTimeout-dialog").dialog("open");
                    setActivityCheckTimer("stop");
                    setRedirTimer("start");
                },
                inactivityParms.warnAfter);
            break;
        case "stop":
            clearTimeout(warningTimer)
    }
}


function setRedirTimer(redirTimerAction) {
    switch (redirTimerAction) {
        case "start":
            redirTimer = setTimeout(
                function () {
                    window.location = inactivityParms.redirUrl
                },
                inactivityParms.redirAfter - inactivityParms.warnAfter);
            break;
        case "stop":
            clearTimeout(redirTimer)
    }
}


function AppendWarningMessage() {
    $("body").append('<div title="Session Timeout" id="sessionTimeout-dialog">' + inactivityParms.warningMessage + "</div>");
    $("#sessionTimeout-dialog").dialog({
        autoOpen: false,
        width: 400,
        modal: true,
        closeOnEscape: false,
        open: function () {
            $(".ui-dialog-titlebar-close").hide()
        },
        buttons: {
            "Log Out Now": function () {
                window.location = inactivityParms.logoutUrl
            },
            "Stay Connected": function () {
                $(this).dialog("close");
                pingServerToKeepSessionAliveAndResetTimers();
            }
        }
    });
}

function pingServerToKeepSessionAliveAndResetTimers() {
    setRedirTimer("stop");
    setWarningTimer("stop");
    setActivityCheckTimer("stop");
    $.ajax({ type: "POST", url: inactivityParms.keepAliveUrl });
    setActivityCheckTimer("start");
    setWarningTimer("start");
}

function DetectInputEvents() {
    $(document).keydown(function () {
        haveNewInput = true;
    });
}

(jQuery);

$(document).ready(
    function () {
        AppendWarningMessage();
        DetectInputEvents();
        setActivityCheckTimer("start");
        setWarningTimer("start");
    }
);
于 2013-08-10T23:21:31.697 に答える