2009-08-12 4 views
10

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

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

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

+0

Вы пробовали проверку аутентификацию печенья? Похоже, было бы проще проверить cookie, чтобы определить, зарегистрирован ли пользователь. – user120242

ответ

0

попробовать с кэшем: ложному cache option in jquery ajax:

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

--- EDIT Попробуйте с этим в C# код:

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

тот же результат - я вижу как 302, так и 200 в Firebug, но js видит 200 :( – Slee

+0

может видеть полный URL-адрес вызова ajax ? –

+0

Пожалуйста, заполните здесь JS-код. Спасибо –

0

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

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

Когда я проверяю, чтобы увидеть, если сеанс остается в силе, я также следить за " 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'); 
}); 
0

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

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

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

Удачи.

7

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

Глобальный.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; 
      } 
     } 
     }); 
    }); 
Смежные вопросы