Как вы работаете с запросами 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();
    }
  }
});