Как вы справляетесь с AJAX-запросами, когда пользовательский сеанс истекает, или когда запрос заканчивается 302
Другие подобные вопросы были заданы, но они не имели тенденцию иметь дело с универсальным многоцелевым решением. Они имели тенденцию иметь дело только с проблемами аутентификации пользователя. Иногда 302 действителен для других обстоятельств.
Итак, как вы можете создать общий обработчик 302 для запросов AJAX, сохраняя при этом функциональность для всего остального в вашем приложении?
2 ответа
Решение, которое мы придумали в итоге, было немного хакерским, но выглядит довольно элегантно.
Начните с перехвата любых 302, которые поступают из ajax-запроса в вашем файле global.asax.
protected void Application_EndRequest()
{
var context = new HttpContextWrapper(Context);
if (Context.Response.StatusCode == 302 && context.Request.IsAjaxRequest())
{
Context.Response.Clear();
Context.Response.StatusCode = 308;
}
}
Мы изобрели код состояния 308, чтобы браузер не перехватывал 302 и не вызывал сбой jquery.
И затем где-нибудь в вашем глобальном файле JavaScript добавьте следующее
$(document).ajaxError(function (e, request, errorThrown, exception) {
if (request.status == "308") {
window.location = request.getResponseHeader('location');
}
});
Это позволяет jquery обнаруживать перенаправление, а затем направлять пользователя на запрошенную страницу.
Кажется, вы можете просто добавить условное выражение для проверки этого конкретного статуса. Если request - это ваш объект XMLHttpRequest, то дополнительно проверьте состояние, когда readyState равен 4:
if(request.readyState == 4){
if(request.status == 302) {
doSomething();
}
else {
doSomethingElse();
}
}
редактировать:
или, альтернативно, если вы не хотите использовать прямой javascript (поскольку, честно говоря, вы отметили его как jquery-ajax), то что-то вроде этого:
$.ajax({
statusCode: {
302: function() {
doSomething();
}
}
});