2010-02-23 3 views
11

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

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

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

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

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

ответ

15

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

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

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

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

Другой способ - отложить тайм-аут сеанса аяксиально. Используйте 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'; 
    } 
} 
+0

Большое спасибо за ваш ответ. – lidermin

Смежные вопросы