MVC с JQuery: обработка Сессии Истекает

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

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

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

Заранее спасибо.

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

11
задан tereško 13 June 2012 в 22:54
поделиться

1 ответ

Обычно это неисправимая ошибка, которую лучше всего отображать как отдельную страницу с ошибкой. Настройте веб-приложение для отображения настраиваемой страницы ошибки 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';
    }
}
16
ответ дан 3 December 2019 в 07:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: