2012-06-04 5 views
11

Mam aplikację HTML5, która używa manifestu pamięci podręcznej, aby zapewnić funkcjonalność offline. Ta aplikacja wykonuje wywołania ajaxowe, gdy jest online, a niektóre z tych połączeń mogą uzyskać nieautoryzowaną odpowiedź 403.Konflikt podręczny HTML5: niepomyślne wywołania ajaxowe w odpowiedzi na błąd

Oto dno mojego pliku cache.manifest:

NETWORK: 
* 

FALLBACK: 
//offline 

Jeśli usunąć sekcję awaryjnej, wszystkie rozmowy ajax otrzymujących pracę 403 odpowiedzi zgodnie z oczekiwaniami i mogę wykryć to z jQuery obsługi błędów i przekierować użytkownika do formularza logowania.

Ale jeśli sekcja rezerwowa jest obecna, te same wywołania uzyskują odpowiedź 200 OK, z treścią zastępczą HTML jako treścią, mimo że serwer odpowiedział numerem 403, więc nie ma możliwości, aby się dowiedzieć, że użytkownik nie jest uwierzytelniony i należy wysłać na stronę logowania.

Czy tu czegoś brakuje? Z góry dziękuję

+0

masz na myśli fallback zostaje wykonany, nawet gdy użytkownik jest online, a plik naprawdę nie istnieje? – Ekim

+0

Tak, spodziewasz się, że flaga wieloznacznika online ('*') zastąpi to, co wprowadziłeś w poczcie awaryjnej. Ale działa na odwrót, na [spec] (http://www.w3.org/TR/2011/WD-html5-20110525/offline.html#parsing-cache-manifests) –

Odpowiedz

2

Dodanie losowej liczby jako parametru zapytania do strony, której szukasz do jQuery-AJAX rozwiąże problem; tj

$.ajax({ 
    url: "/data.html?"+ Math.random(), 
    // other properties here... 
}); 
0

Od http://alistapart.com/article/application-cache-is-a-douchebag#latest

Oto odniesienie że błędy mogą wystąpić z powodu zgłaszania kod statusu jako 0, co jest interpretowane jako porażka:

$.ajax(url).always(function(response) { 
// Exit if this request was deliberately aborted 
if (response.statusText === 'abort') { return; } // Does this smell like an error? 
if (response.responseText !== undefined) { 
    if (response.responseText && response.status < 400) { 
    // Not a real error, recover the content resp 
    } 
    else { 
    // This is a proper error, deal with it 
    return; 
    } 
} // do something with 'response' 
}); 
Powiązane problemy