Как сохранить сеанс пользователя во время публикации на форуме?

У меня есть сайт с таймаутом сеанса 15 минут. На некоторых страницах пользователь иногда тратит более 15 минут на заполнение ответа. Какое наилучшее решение сохранить сеанс в этом случае?

Я уже использую JQuery на этих страницах, поэтому, возможно, пинговать сервер, но какие события?

Бэкэнд - это Struts на Tomcat.

Ответы

Ответ 1

Учитывая, что вы не хотите менять тайм-аут сеанса сайта.

Установите время ожидания/интервала (< 15min) в javascript и решите, что делать, когда событие запускается. Если вы хотите, чтобы сеанс был активным до тех пор, пока страница открыта, затем выполните штраф, продолжайте пинговать каждый < 15 мин. Но это, вероятно, не то, что вы хотите, так как пользователь, покидающий общедоступный компьютер, должен выйти из системы в какой-то момент.

Вы можете сохранить переменную lastActivity, которая обновляется для каждого документа mousemove или keydown документа. Если с момента последнего ping была какая-либо активность, пинг снова.

Чтобы усложниться, вы можете подсчитывать события и пинговать сервер только в том случае, если количество событий > пороговое значение при таймауте.

Основной пример:

setInterval(function(){
   $.get('/ImStillAlive.action');
}, 840000); // 14 mins * 60 * 1000

С базовой проверкой для операции ввода:

$(function(){
    var lastUpdate = 0;
    var checkInterval = setInterval(function(){
       if(new Date().getTime() - lastUpdate > 840000){
           clearInterval(checkInterval);
       }else{   
            $.get('/ImStillAlive.action');
       }
    }, 840000); // 14 mins * 60 * 1000

    $(document).keydown(function(){
         lastUpdate = new Date().getTime();
    });
});

Ответ 2

Я думаю, что вы действительно не хотите этого для ВСЕХ страниц. Если бы вы делали это на каждой странице, даже те, которые действительно не зависят от переменных сеанса, вы потребляете много памяти.

Я бы предложил бросить в условное условие, чтобы сделать это только на определенных страницах, где это необходимо, т.е.

if (location.href.indexOf('/checkout') !== -1) {
setInterval(function(){
    $.get('/keepalive.action');
}, 840000); // 14 mins
}

Ответ 3

Вы можете установить интервал каждые 5 минут:

setInterval(function() {
    // check if a reply textarea is present on the page and focussed
    // assuming it e.g. a textarea with the id "reply"
    if ($('#reply:focussed').length) {
        // user is still on the reply page
        // call on a script on the server that renews the session
    }
}, 300000);

Или проверьте, все ли он что-то набирает:

<textarea id="reply"></textarea>
<input type="hidden" id="reply_length" name="length" />
setInterval(function() {
    // get length of text in textarea
    var len = $('#reply').val().length;

    // get previous length
    var prev = $('#reply_length').val().length;

    // if they don't match, assume they're doing something
    if (len != prev) {
        // renew session
    }

    // update previous length
    $('#reply_length').val(len);
}, 300000);