web-dev-qa-db-de.com

Warnen Sie den Benutzer vor dem Sitzungszeitlimit

Ich habe eine Webanwendung in Spring MVC, JSP implementiert.
Das Standardzeitlimit für Sitzungen ist in web.xml definiert und beträgt 30 Minuten. 

wenn der Benutzer 25 Minuten lang im Leerlauf ist, muss ich dem Benutzer ein Popup mit der Meldung anzeigen, dass Your session is going to be end by 5 min, Please click OK to continue

Können wir dies mit JavaScript, jquery oder einem anderen Ansatz erreichen? 

Bitte vorschlagen. 

12
user3509911

Versuchen Sie diesen Code. Hoffentlich löst es dein Problem. Vielen Dank

var cookieName = 'sessionMsg';
var message = 'Your session is going to be end by 5 min, Please click OK to continue';

function getCookie(name)
{
    var name = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i<ca.length; i++)
    {
        var c = ca[i].trim();
        if (c.indexOf(name)==0) return c.substring(name.length,c.length);
    }
    return "";
}

function setSessionPrompt() {
    var timeout = getCookie(cookieName) - new Date().getTime();
    setTimeout(function(){
        if (new Date().getTime() < getCookie(cookieName)) {
            setSessionPrompt();
        } else {
            if(confirm(message)) {
                // do your action here
            }
        }
    }, timeout);
}

setSessionPrompt();
3
Mohit

Sie können wie folgt verwenden: Ich verwende das in einer JSP-Seite wie header.jsp. Es funktioniert gut für mich. Ich benutze Frühling, Jsp und Jquery.

javascript:

<code>
<script type="text/javascript">
    //var recall = true;
    function loadDialog() { 
            var sessionAlive = ${pageContext.session.maxInactiveInterval};          
            var notifyBefore = 30; // Give client 15 seconds to choose.
            setTimeout(function() {       
                $(function() {
                    $( "#dialog" ).dialog({
                        autoOpen: true,
                        maxWidth:400,
                        maxHeight: 200,
                        width: 400,
                        height: 200,
                        modal: true,
                        open: function(event, ui) {
                            setTimeout(function(){
                                $('#dialog').dialog('close'); 
                            }, notifyBefore * 1000);
                        },
                        buttons: {
                        "Yes": function() {  
                             $.get("/about", function(data,status){
                               // alert("Data: " + data + "\nStatus: " + status);
                              });                             
                            $('#dialog').dialog("close");
                            loadDialog();
                        },
                        "No": function() {  
                            $('#dialog').dialog("close");
                        }
                       },
                       close: function() {}
                    });
                  });
            }, (sessionAlive - notifyBefore) * 1000);
    };

    loadDialog(); 
</script>

HTML Div:

<div id="dialog" title="Session Timeout Info" style="display:none">
  <p>
    Your session will be timeout within 30 seconds. Do you want to continue session?  
  </p>
</div> 
</code>
3
Md. Kamruzzaman

Sie können bei jeder Anforderung einen Cookie mit der verbleibenden Zeit (in Millisekunden) senden. Dann können Sie setTimeout wie vorgeschlagen verwenden, aber den Wert erneut testen, wenn die Timeout-Funktion ausgeführt wird. Wenn sich der Wert geändert hat, können Sie den Timeout zurücksetzen. Da das Cookie für die gesamte Domäne festgelegt ist, ist es auch für Ajax oder andere Registerkarten immer korrekt.

var cookieName = 'sessionMsg';
var message = 'Your session is going to be end by 5 min, Please click OK to continue';

function getCookie(name)
{
    var name = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i<ca.length; i++)
    {
        var c = ca[i].trim();
        if (c.indexOf(name)==0) return c.substring(name.length,c.length);
    }
    return "";
}

function setSessionPrompt() {
    var timeout = getCookie(cookieName) - new Date().getTime();
    setTimeout(function(){
        if (new Date().getTime() < getCookie(cookieName)) {
            setSessionPrompt();
        } else {
            if(confirm(message)) {
                // do your action here
            }
        }
    }, timeout);
}

setSessionPrompt();
2
flec

Um den Benutzer über die Timeouts im Frontend zu informieren, müssen Sie diese Informationen aus Ihrem Backend weiterleiten. Um dies zu erreichen, habe ich die Informationen in https://www.javaworld.com/article/2073234/tracking-session-expiration-in-browser.html als Basiswert verwendet.

Bei jeder Antwortmethode in Ihrem Controller müssen Sie Cookies einschließen, die die Sitzungszeitüberschreitungszeit sowie die aktuelle Serverzeit enthalten. Da sich anscheinend das Session-Timeout in Ihrer web.xml bereits festgelegt hat, können Sie Ihrer Antwort Cookies hinzufügen.

@RequestMapping(value="/example", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public ResponseEntity<Object> getExample(HttpServletRequest servletRequest, HttpServletResponse servletResponse) {
     addTimeoutCookies(servletRequest, servletResponse);

     //Do actual actions

     return new ResponseEntity<Object>(HttpStatus.OK)
}

private void addTimeoutCookies(HttpServletRequest servletRequest, HttpServletResponse servletResponse) {

    long currTime = System.currentTimeMillis();
    long expiryTime = currTime + servletRequest.getSession().getMaxInactiveInterval() * 1000;

    Cookie serverTimeCookie = new Cookie("serverTime", "" + currTime);
    serverTimeCookie.setPath("/");
    servletResponse.addCookie(serverTimeCookie);

    Cookie expiryCookie = new Cookie("sessionExpiry", "" + expiryTime);
    expiryCookie.setPath("/");
    servletResponse.addCookie(expiryCookie);
}

Anschließend müssen Sie am Frontend die Werte dieser Cookies abrufen und mit der aktuellen Uhrzeit des Clients vergleichen, um zu bestimmen, wann der Benutzer über das bevorstehende Sitzungszeitlimit benachrichtigt werden soll. Hier ist ein einfacher Codeblock, der auf den anderen Antworten und dem Artikel unter dem Link basiert:

var currTimeCookieName = 'serverTime';
var expireTimeCookieName = 'sessionExpiry';
var offset;
var warningTime = 5 * 60 * 1000;
var timeoutWarningMessage = 'Your session is going to be end by 5 min, Please click OK to continue';

function getCookie(name)
{
    var name = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i<ca.length; i++)
    {
        var c = ca[i].trim();
        if (c.indexOf(name)==0) return c.substring(name.length,c.length);
    }
    return "";
}

var serverTime = getCookie(currTimeCookieName);
serverTime = serverTime==null ? null : Math.abs(serverTime);
var offset = (new Date()).getTime() - serverTime;

function getTimeToWarning() {
    var expireTime = getCookie(expireTimeCookieName);
    return expireTime + offset - currTime - warningTime;
}

function checkForTimeout() {
    var timeUntilWarning = getTimeToWarning();

    setTimeout(function(){
        if (getTimeToWarning() > 0) {
            checkForTimeout();
        } else {

            if(confirm(timeoutWarningMessage)) {
                //TODO do a backend call or other action to extend the session here

                setTimeout(function() {
                    checkForTimeout();
                }, 1 * 60 * 1000);
            }
        }
    }, timeUntilWarning);
}

checkForTimeout();
1
wardanuy

Sie sollten WebSockets verwenden, um Daten aus der Webanwendung an den Client-Browser zu senden.

1) Berechnen Sie die Sitzungszeitüberschreitung auf der Serverseite. 2) Websocket sendet die Nachricht über die Sitzungszeitüberschreitungsmeldung.

0
Nitul

Sie können das folgende Plugin verwenden - Jtimeout jquery plugin Funktioniert einwandfrei und ist auch konfigurierbar.

0
Srimoyee Sen