Как вы работаете с запросами AJAX, когда истекает срок действия пользовательского сеанса или когда запрос завершается в 302
Были заданы другие подобные вопросы, но они не имели отношения к универсальному многоцелевому решению. Они имели дело только с проблемами аутентификации пользователей. Иногда 302 действителен для других обстоятельств.
Итак, как вы можете создать общий обработчик 302 для запросов ajax, сохраняя при этом функциональность для чего-либо еще в своем приложении?
Ответы
Ответ 1
Решение, с которым мы столкнулись, в конце концов было немного взломанным, но кажется довольно элегантным.
Начните с перехвата любых 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 может обнаруживать перенаправление, а затем направлять пользователя на запрошенную страницу.
Ответ 2
Кажется, вы можете просто добавить условие, чтобы проверить этот конкретный статус. Если запрос является вашим объектом XMLHttpRequest, дополнительно проверьте статус, когда readyState равен 4:
if(request.readyState == 4){
if(request.status == 302) {
doSomething();
}
else {
doSomethingElse();
}
}
изменить:
или, альтернативно, если вы не хотите использовать прямой javascript (так как с честностью вы отметили его как jquery-ajax), то что-то вроде этого:
$.ajax({
statusCode: {
302: function() {
doSomething();
}
}
});