2012-10-11 14 views
8

Zastanawiam się, czy istnieje sposób, aby wykryć, kiedy odpowiedź jest zwracana z lokalnej pamięci podręcznej? Czy to możliwe?Jak wykryć, kiedy XHR zwraca buforowany zasób?

Rozwiązanie powinno być ogólne i działać bezwarunkowo. W tym przypadku kod odpowiedzi zawsze wynosi 200 OK, ale XHR zwraca buforowany zasób dla drugiego żądania (np. Pierwsza odpowiedź zawiera nagłówek Expires, więc nie ma potrzeby zadawania pytania o serwer dla nowego zasobu przed datą wygaśnięcia).

+0

Nie brzmi to możliwe. Co powiesz na dodanie znacznika czasu do odpowiedzi? –

+0

Nie wiem, ale Narzędzia dla programistów Chrome mogą wyświetlać te informacje; (Panel sieci, kolumna Rozmiar - z pamięci podręcznej) Więc zastanawiam się, jak to robią;) (Firebug dla FF to samo, nagłówki odpowiedzi: z pamięci podręcznej) – filip26

Odpowiedz

5

Odpowiedź jest data nagłówek

  • Jeśli data nagłówek jest przed wysłaniem datę następnie odpowiedź pochodzi z cache.
  • Jeśli nagłówek daty jest późniejszy niż data wysłania żądania, odpowiedź jest nowa.

np.

  • z pamięci podręcznej: wniosek został wysłany o godzinie 11:00, data odpowiedź jest 10:59
  • no cache: wniosek został wysłany o godzinie 11:00, data odpowiedź jest 11:01
+0

To oczywiście działa tylko w rozszerzeniu Chrome. –

+0

@RichBradshaw W końcu znalazłem ogólne rozwiązanie. Odpowiedź jest zaktualizowana. – filip26

0

Sprawdź, czy zwrócony kod stanu to 304 (niezmodyfikowany) w funkcji onreadystatechange. Coś wzdłuż linii:

xmlhttp.onreadystatechange=function() 
{ 
    if (xmlhttp.readyState==4 && xmlhttp.status==304) 
    { 
     alert("Cached"); 
    } 
} 
+0

Dziękuję @ kmb385, ale to rozwiązanie działa tylko w przypadku warunkowego żądania (jeśli - *, np. If-Modified-Since, If-None-Match) i szukam ogólnego rozwiązania. Pytanie zostało zaktualizowane. – filip26

1

Najwidoczniej możemy również użyć parametru Resource Timing API, aby ustalić, czy coś zostało dostarczone z pamięci podręcznej przeglądarki; jeśli transferSize ma wartość 0 (a encodedBodySize ma wartość> 0), oznacza to trafienie w pamięci podręcznej.

To wydaje się lepszym rozwiązaniem niż inne, o ile masz do czynienia z a browser that supports it.

Ref: https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/transferSize

Powiązane problemy