Как я мог обработать сессию, истекают на приложении MVC, которое имеет вызовы метода Ajax JQuery на определенных страницах. Проблема следующая:
Как я мог обработать это поведение, и который является лучшим способом обработать его (пытающийся как можно больше не изменить так много части кода приложения)?
Заранее спасибо.
PD: могло бы быть полезно сказать, что я использую $.post()
из JQuery.
Обычно это неисправимая ошибка, которую лучше всего отображать как отдельную страницу с ошибкой. Настройте веб-приложение для отображения настраиваемой страницы ошибки 4nn / 5nn
и настройте jQuery следующим образом:
$(document).ready(function() {
$.ajaxSetup({
error: handleXhrError
});
});
function handleXhrError(xhr) {
document.open();
document.write(xhr.responseText);
document.close();
}
Таким образом, страница ошибки 4nn / 5nn
на стороне сервера будет отображаться, как если бы она вызвано синхронным запросом. Я уже публиковал похожую тему на эту тему раньше.
Другой способ - отложить тайм-аут сеанса аяксическим способом. Используйте setInterval ()
, чтобы запускать запрос опроса на сервер (который, в свою очередь, в основном захватывает сеанс из запроса) каждый раз после истечения срока сеанса минус десять секунд или около того.
setInterval(function() { $.get('poll'); }, intervalInMillis);
Но предостережение заключается в том, что сеанс будет существовать до тех пор, пока у клиента открыто окно браузера, что иногда может занять слишком долго. При необходимости вы можете комбинировать это с своего рода средством проверки активности , чтобы свести к минимуму вероятность истечения срока действия сеанса. Вам все еще нужно совместить это с приличным обработчиком ошибок 4nn / 5nn
.
$(document).ready(function() {
$.active = false;
$('body').bind('click keypress', function() { $.active = true; });
checkActivity(1800000, 60000, 0); // timeout = 30 minutes, interval = 1 minute.
});
function checkActivity(timeout, interval, elapsed) {
if ($.active) {
elapsed = 0;
$.active = false;
$.get('poll'); // Let server code basically do a "get session from request".
}
if (elapsed < timeout) {
elapsed += interval;
setTimeout(function() {
checkActivity(timeout, interval, elapsed);
}, interval);
} else {
alert($.messages.timeout); // "You will be logged out" blah blah.
window.location = 'http://example.com/logout';
}
}