JQuery AJAX видит перенаправление как статус 200 не 302?

Я использую jQuery и плагин jQuery.form для отправки моей формы (также используя ASP.Net MVC).

Проблема заключается в том, что пользователь находится в разделе сайта, на котором используется проверка подлинности форм, и если их файл cookie auth истекает в течение их времени на странице, а не возвращает статус 302, который будет перенаправлять на страницу входа, я все равно получите 200?

В FireBug я вижу 302 Найдено, а затем моя страница входа в систему будет обслуживаться далее как 200, которая является кодом состояния, отправленным обратно на мой вызов Ajax. Как узнать, что они были выведены из системы, если я никогда не увижу 302, отправленных обратно в плагин формы jQuery?

Ответ 1

Мне действительно нравится это решение. Изменяя ответ 302 на запросы ajax на 401, он позволяет настроить ваш ajax на стороне клиента, чтобы контролировать любой запрос ajax, ищущий 401, и если он найдет перенаправление на страницу входа. Очень простой и эффективный.

Global.asax:

protected void Application_EndRequest()
{
    if (Context.Response.StatusCode == 302 &&
        Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
    {
        Context.Response.Clear();
        Context.Response.StatusCode = 401;
    }
}

Клиентский код:

 $(function () {
      $.ajaxSetup({
        statusCode: {
          401: function () {
            location.href = '/Logon.aspx?ReturnUrl=' + location.pathname;
          }
        }
      });
    });

Ответ 2

попробуйте с кешем: false параметр кеша в jquery ajax:

$.ajax({
  url: "test.html",
  cache: false,
  success: function(html){
    $("#results").append(html);
  }
});

--- EDIT Попробуйте это в коде С#:

protected void Page_Load(object sender, System.EventArgs e)
{
   Response.Cache.SetCacheability(HttpCacheability.NoCache);
   ...
}

Ответ 4

Это решение, которое я использовал в прошлом:

Серверная сторона:

Когда я проверяю, действительно ли сеанс по-прежнему действителен, я также наблюдаю за заголовком "X-Requested-With", который должен быть "XMLHttpRequest", если вы используете jQuery (ПРИМЕЧАНИЕ: IE имеет тенденцию возвращать имя заголовка в нижнем регистре, поэтому следите за этим). Если сеанс действительно истек, а заголовок присутствует, вместо использования перенаправления HTTP я отвечаю простым JSON-объектом следующим образом:

{ "SESSION": "EXPIRED" }

Клиентская сторона:

В моем onload-коде я использую событие jQuery ajaxComplete, чтобы проверить все входящие запросы для объекта с истекшим сроком действия. Код выглядит примерно так:

$(window).ajaxComplete(function(ev, xmlhr, options){
    try {
        var json = $.parseJSON(xmlhr.responseText);
    }
    catch(e) {
        console.log('Session OK');
        return;
    }

    if ($.isPlainObject(json) && json.SESSION == 'EXPIRED') {
        console.log('Session Expired');

        //inform the user and window.location them somewhere else

        return;
    }

    console.log('Session OK');
});

Ответ 5

Я уверен, что вы никогда не получите 302 в завершенном состоянии объекта XHR. Если происходит перенаправление, соединение все еще выполняется до тех пор, пока вы не увидите ответ со страницы входа (который должен быть 200, если он существует).

Однако зачем вам смотреть 302? Конечно, если вы получаете переадресацию на login.php, то просто получение URL-адреса (или синтаксического анализа для содержимого) возвращаемого ответа говорит вам, что они вышли из системы?

Альтернатива, только если вы хотите узнать, как только срок действия сессии истек (прежде чем они совершают какое-либо действие), необходимо опросить сервер с помощью setTimeout или аналогично получить информацию о состоянии аутентификации.

Удачи.