Как вы справляетесь с 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();
    }
  }
});
Другие вопросы по тегам