Как сохранить сеанс пользователя во время публикации на форуме?
У меня есть сайт с таймаутом сеанса 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);