2009-08-12 18 views
10

Używam jQuery i wtyczki jQuery.form do przesyłania mojego formularza (również przy użyciu ASP.Net MVC).jQuery AJAX patrz przekierowanie jako status 200 nie 302?

Problem polega na tym, że użytkownik znajduje się w części strony, która korzysta z uwierzytelniania formularzy i jeśli ich plik cookie auth wygasa w czasie ich pobytu na stronie zamiast odzyskać status 302, który byłby przekierowaniem do strony logowania, Nadal dostaję 200?

W FireBug widzę stronę Znaleziono 302, a następnie moja strona logowania jest wyświetlana jako 200, która jest kodem statusu wysłanym z powrotem do mojego połączenia Ajax. Jak wykryć, że zostały wylogowane, jeśli nigdy nie widzę, aby 302 odesłano do wtyczki formularza jQuery?

+0

Czy próbowałeś sprawdzania cookie auth? Wydaje się, że łatwiej byłoby sprawdzić plik cookie, aby wykryć, czy użytkownik jest zalogowany. – user120242

Odpowiedz

0

spróbować z cache: false cache option in jquery ajax:

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

--- EDIT Spróbuj z tym w kod C#:

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

ten sam wynik - widzę zarówno 302, jak i 200 w Firebugu, ale js widzi 200 :( – Slee

+0

może zobaczyć pełny URL wywołania ajaxowego ? –

+0

Proszę uzupełnić kod JS tutaj, dzięki –

0

To rozwiązanie Użyłem w przeszłości:

po stronie serwera:

Kiedy jestem sprawdzając, czy sesja jest nadal ważna, ja też miej oko na " X-Requested-With "nagłówek, który powinien być" XMLHttpRequest ", jeśli używasz jQuery (UWAGA: IE ma tendencję do zwracania nazwy nagłówka małymi literami, więc uważaj na to również). Jeśli sesja ma rzeczywiście wygasł a nagłówek jest obecny, a nie za pomocą przekierowania HTTP, mogę odpowiedzieć z prostym obiektu JSON tak:

{ "SESSION": "EXPIRED" } 

po stronie klienta:

W moim kodu onload, używam Zdarzenie ajaxComplete jQuery w celu sprawdzenia wszystkich przychodzących ładunków żądania dla obiektu, który wygasł przed sesją. Kod wygląda mniej więcej tak:

$(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

Jestem prawie pewien, że nigdy nie otrzymasz 302 w ukończonym stanie obiektu XHR. Jeśli nastąpi przekierowanie, połączenie jest nadal w toku, dopóki nie zobaczysz odpowiedzi ze strony logowania (która powinna wynosić 200, jeśli istnieje).

Jednak, dlaczego musisz zobaczyć 302? Z pewnością, jeśli otrzymujesz przekierowanie do login.php, po prostu otrzymanie adresu URL (lub parsowanie zawartości) zwróconej odpowiedzi mówi, że zostały wylogowane?

Alternatywą, tylko jeśli chcesz wiedzieć, jak tylko sesja wygasła (zanim wykonają jakąś czynność), jest odpytanie serwera za pomocą metody setTimeout lub podobnej, aby uzyskać informacje o statusie uwierzytelniania.

Powodzenia.

7

Bardzo podoba mi się to rozwiązanie. Zmieniając odpowiedź 302 na żądania ajaxa na 401, pozwala skonfigurować ajax po stronie klienta, aby monitorować zapytanie ajaxowe szukające 401 i jeśli znajdzie przekierowanie na stronę logowania. Bardzo prosty i skuteczny.

Globalna.asax:

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

Client Side Kod:

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