Dokonałem zadania z dodawaniem funkcjonalności do aplikacji ASP.NET 4.0 Web Forms Forms, aby ostrzec przez użytkownika wkrótce przed ich końcem sesji i zapewnienie opcji, aby kontynuować sesję, albo zakończyć sesję.

Wdrożyłem to za pośrednictwem okna dialogowego potwierdzenia, które ostrzega użytkownikowi, że sesja wkrótce zakończy się wkrótce i dając opcję naciśnięcia "OK", aby kontynuować sesję lub naciskając "Anuluj", aby zakończyć sesję.

Na naciśnięciu "Anuluj" strona przekierowuje na stronę wylogowania.

Po naciśnięciu "OK", wywołuję jQuery na żądanie na pustej stronie ASPX w mojej aplikacji (Keepalive.aspx). Jak rozumiem, gdy użytkownik składa wniosek na stronę, ASP.NETShould dbać o odnowienie sesji - a tym samym resetowanie limitu czasu sesji.

Odkryłem jednak, że gdy naciska, sesja nie jest rozszerzona, a więc czas. Jest to pomimo uzyskania prośby, które najwyraźniej powodzeniem (np. Wywołana jest funkcja zwrotna).

Kode, którego używałem, który kiedyś wdrożył, jako funkcja JavaScript, która zostanie wywołana przez zdarzenie onload na stronie głównej - więc jest dziedziczony przez wszystkie inne strony w aplikacji.

var intervalID;

/* Set a timeout interval based on the server timeout value (-10%) */
function setTimeoutInterval() 
{
    /* Session timeout warning dialog */

    // Get session timeout value
    var timeoutMins = "<asp:ContentPlaceHolder id='timeoutPlaceholder' runat='server'><%= Session.Timeout %></asp:ContentPlaceHolder>";

    // Subtract 10% of the timeout value - to give the user a chance to continue the session before it expires
    var remainingTimeMins = Math.ceil(timeoutMins * 0.1);
    var timeoutMins = timeoutMins * 0.9;

    // Convert the timeout value to milliseconds
    var timeout = timeoutMins * 60 * 1000;

    // Set javascript timeout
    intervalID = window.setInterval("displayTimeoutDialog(" + remainingTimeMins + ")", timeout);
}

/* Display a dialog prompting the user to continue the current session or to end the session */
function displayTimeoutDialog(remainingTimeMins) 
{
    var result = confirm("The session will end in ~" + remainingTimeMins +
    " minute(s). Press OK to continue, or Cancel to log out.");

    if (result == true) {
        // Keep the session alive
        alert("Keep alive!");
        $.get("KeepAlive.aspx", function() { alert("Successful request"); });
    }
    else {
        // Redirect to the logout page
        window.location.href("Logout.aspx");
    }
}
1
Ciaran Gallagher 6 grudzień 2013, 18:45

3 odpowiedzi

Najlepsza odpowiedź

Znaleźliśmy rozwiązanie, które nie wymaga odświeżania strony, włączony jest użytkownika.

Osiągnięto to za pomocą ukrytych html iframe na stronie:

<iframe id="keepAlive" src="KeepAlive.aspx" frameborder="0" width="0" height="0" runat="server"></iframe>

Dodałem metody JavaScript, które implementują timer i okno dialogowe na stronie IFrame. Gdy użytkownik chce odnowić sesję, naciskają przycisk "Kontynuuj" na przycisku okna dialogowego, po prostu odświeżyamy stronę IFrame. Odświeżanie powoduje odnowienie sesji, bez użytkownika utraty na stronie, nad którą pracuje - ponieważ jest to iframe, który się odświeża, a nie rzeczywista strona, w której użytkownik jest włączony.

Pamiętaj, że cały ten kod znajduje się na stronie głównej ASP.NET, więc jest dziedziczona na każdej stronie ASPX w naszej aplikacji. JavaScript na IFRame jest wywoływany w imprezie {X0}}.

        var intervalID;

        /* Set a timeout interval based on the server timeout value (-10%) */
        function setTimeoutInterval() 
        {
            /* Session timeout warning dialog */

            // Get session timeout value
            var timeoutMins = "<%= Session.Timeout %>";

            // Subtract 10% of the timeout value - to give the user a chance to continue the session before it expires
            var remainingTimeMins = Math.ceil(timeoutMins * 0.1);
            var timeoutMins = timeoutMins * 0.9;

            // Convert the timeout value to milliseconds
            var timeout = timeoutMins * 60 * 1000;

            // Set javascript timeout
            intervalID = window.setInterval("displayTimeoutDialog(" + remainingTimeMins + ")", timeout);
        }

        /* Display a dialog prompting the user to continue the current session or to end the session */
        function displayTimeoutDialog(remainingTimeMins) 
        {
            var result = confirm("The session will end in ~" + remainingTimeMins +
            " minute(s). Press OK to renew, or Cancel to let your session expire.");

            if (result == true) {
                // Keep the session alive and clear the interval
                alert("Session renewed.");
                window.location.href("KeepAlive.aspx");
            }
            else {
                // Redirect to the logout page
                window.clearInterval(intervalID);
            }

        }
1
Ciaran Gallagher 20 grudzień 2013, 11:19

Zastanawiam się, czy Ajax się nie wystarczy. Może to być, że Get nie wywołuje cyklu życia całego strony, a więc sesja nie jest odnawiana. Czy próbowałeś ponownie załadować stronę, zamiast wydawać? Wiem, że nie jest tak elegancki, ale byłby interesujący wiedzieć.

1
Stefan 6 grudzień 2013, 15:07

Upewnij się, że Twoja prośba zawiera ten sam identyfikator sesji i nie używasz Sessionidów COOKIELESS.

Zobacz http://msdn.microsoft.com/ en-us / biblioteka / MS178581% 28v = vs.90% 29.aspx

Identyfikatory sesji.

Sesje są identyfikowane przez unikalny identyfikator, który można odczytać za pomocą właściwości Sessionid. Gdy stan sesji jest włączony dla aplikacji ASP.NET, każdy wniosek o stronę w aplikacji jest zbadany dla wartości sesji wysyłanej z przeglądarki. Jeśli nie jest dostarczona żadna wartość sessionId, ASP.NET rozpoczyna nową sesję, a wartość sessionID dla tej sesji jest wysyłana do przeglądarki z odpowiedzią.

Domyślnie wartości sessionID są przechowywane w pliku cookie. Można jednak skonfigurować aplikację do przechowywania wartości sessionID w adresie URL dla sesji "Cookiels".

Sesja jest uważana za aktywną, dopóki prośby nadal są wykonane z tej samej wartości sesji. Jeśli czas między wnioskami o określoną sesję przekracza określoną wartość czasu w minutach, sesja jest uważana za wygasłą. Wnioski dotyczące wygasłej wartości sessionId skutkuje nową sesją.

0
user2174334 6 grudzień 2013, 15:11