Предупреждать пользователя перед таймаутом сеанса

У меня есть веб-приложение, реализованное в Spring MVC, JSP.
Тайм-аут сеанса по умолчанию определяется в web.xml составляет 30 минут.

если пользователь простаивает в течение 25 минут, чем мне нужно показать всплывающее окно с сообщением, что Your session is going to be end by 5 min, Please click OK to continue.

Можно ли достичь этого, используя JavaScript, jquery или любой другой подход?

Прошу предложить.

Ответ 1

Попробуйте этот код. Надеюсь, это решит вашу проблему. Благодаря

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

Вы можете использовать следующее: Я использую это на странице jsp, например header.jsp. Он отлично работает для меня. Я использую spring, jsp и 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

Вы можете отправить cookie с оставшимся временем (в миллисекундах) по каждому запросу. Затем вы можете использовать setTimeout, как было предложено, но снова проверить значение, когда выполняется функция тайм-аута. Если значение изменилось, вы можете reset время ожидания. Поскольку cookie установлен для всего домена, он всегда будет правильным даже для ajax или других вкладок.

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();

Ответ 4

Чтобы уведомить пользователя о тайм-аутах в интерфейсе, вам необходимо передать эту информацию с вашего сервера. Для этого я использовал информацию в https://www.javaworld.com/article/2073234/tracking-session-expiration-in-browser.html в качестве базовой линии.

В каждом методе Response в вашем контроллере вам необходимо включить файлы cookie, содержащие время ожидания сеанса, а также текущее время сервера. Поскольку, похоже, вы уже установили тайм-аут сеанса в своем web.xml, вы можете добавить файлы cookie к вашему ответу с чем-то похожим на:

@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);
}

Затем на интерфейсе вам нужно получить значения этих куки файлов и сравнить их с текущим временем клиента, чтобы определить, когда следует уведомить пользователя о предстоящем тайм-ауте сеанса. Вот простой блок кода, чтобы сделать это, на основе других ответов здесь и статьи по ссылке:

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();

Ответ 5

Вы должны использовать WebSockets для отправки данных из веб-приложения в браузер клиентов.

1) рассчитать таймауты сеанса на стороне сервера. 2) Websocket отправит сообщение о времени сеанса.

Ответ 6

Вы можете использовать следующий плагин - Jtimeout JQuery плагин Работает отлично и настраивается тоже.

Ответ 7

Знаете ли вы windows.setTimeout

http://www.w3schools.com/jsref/met_win_settimeout.asp

Это то, что вам нужно

Например

var resetTime_int;
function resetTimer(){
    if(resetTime_int) window.clearTimeout(resetTime_int)
    resetTime_int=window.setTimeout(function (){
    if(prompt('Your session is going to be end by 5 min, Please click OK to continue'))     
    location.reload()
    }, 1000*60*25)
}

resetTimer()
document.onmousemove=resetTimer
document.onkeyup=resetTimer

1000 * 60 * 25 = 25 минут.