MVC с JQuery: обработка истечения сеанса - PullRequest
11 голосов
/ 23 февраля 2010

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

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

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

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

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

1 Ответ

16 голосов
/ 23 февраля 2010

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

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

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

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

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

setInterval(function() { $.get('poll'); }, intervalInMillis);

Но предостережение заключается в том, что сеанс будет существовать до тех пор, пока у клиента будет открыто окно браузера, что иногда может занять слишком долго. При необходимости вы можете комбинировать это с сортировкой активности 1019 *, так что вероятность истечения сеанса будет минимальной. Вам все еще нужно объединить это с приличным обработчиком ошибок 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';
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...