Подтвердить что ты не робот

MVC с JQuery: обработка Session Expire

Как я могу обработать истечение сеанса в приложении MVC, которое JQuery Ajax вызывает вызовы на определенных страницах. Проблема заключается в следующем:

  • Когда клиент достигает таймаута сеанса, каждый из моих контроллеров наследует класс, который проверяет, жив ли сеанс (просматривая некоторые вещи, такие как сеанс сайта, сеанс базы данных и т.д.) и перенаправляет клиента на новую страницу, говорящую что сеанс истекает; но случай отличается, когда я использую JQuery ajax для вызова методов контроллеров при некоторых нажатиях кнопок, в результате чего он пропускает проверку унаследованного класса и позволяет мне оставаться на странице, но когда контроллер пытается завершить выполнение метода, очевидно, он бросает .Net-ошибки: объекты не создаются как экземпляр объектов, переменные сеанса не найдены и т.д. все из-за истекшего сеанса, который не обрабатывался из-за вызова метода asynchronic.

Как я могу справиться с этим поведением и как лучше всего его обрабатывать (как можно больше не изменять так много частей кода приложения)?

Спасибо заранее.

PD: Может быть полезно сказать, что я использую $.post() из JQuery.

4b9b3361

Ответ 1

Обычно это неустранимая ошибка, которая обычно лучше всего отображаться как отдельная страница с ошибкой. Настройте веб-приложение, чтобы отобразить настроенную страницу ошибки 4nn/5nn и настроить jQuery следующим образом:

$(document).ready(function() {
    $.ajaxSetup({
        error: handleXhrError
    });
});

function handleXhrError(xhr) {
    document.open();
    document.write(xhr.responseText);
    document.close();
}

Таким образом, страница с ошибкой на стороне сервера 4nn/5nn будет отображаться так, как если бы она была вызвана синхронным запросом. Ранее я разместил тему simliar о предмете.

Другой способ - отложить тайм-аут сеанса ajaxically. Используйте setInterval(), чтобы запустить запрос опроса на сервер (который в свою очередь в основном захватывает сеанс из запроса) каждый раз в сеанс -expiration-минус-десять секунд или около того.

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';
    }
}