2009-08-05 21 views
9

Estoy tratando de confiar en el caché del navegador para contener Datos JSON devueltos por llamadas AJAX en jQuery.¿El navegador no puede usar su caché de llamadas ajax anteriores?

La actividad normal del navegador depende de la memoria caché del navegador todo el tiempo. Ejemplo: las imágenes jpg y gif no se vuelven a almacenar en una página recargada.

Pero cuando intento usar jQuery getJSON llamadas ajax, parece que no puedo evitar recuperar los datos del servidor.

Mis cabeceras devueltas ven así (confirmado con Firebug):

Transfer-Encoding: chunked 
Date: Wed, 05 Aug 2009 02:55:39 GMT 
Content-Type: text/plain; charset=ISO-8859-1 
Expires: Wed, 05 Aug 2009 03:55:39 GMT 
Cache-Control: max-age=3600 

embargo, una actualización inmediata de la página hace que las solicitudes idénticas para golpear el servidor.

He visto varias publicaciones sobre cómo evitar el comportamiento de almacenamiento en caché, que no es lo que necesito. He visto varias publicaciones sobre la utilización del almacenamiento en caché, pero todas parecen confiar en al guardar datos en el DOM. Quiero algo que se comporte como las imágenes en caché durante una recarga de página.

¿No puede el buscador simplemente buscarlo desde su propio caché?

--x - x - x - x ACTUALIZACIÓN --x - x - x--

Para mi gran decepción, varias personas respetables de acuerdo en que esto no es sólo posible. Algunos incluso argumentan que no debería ser (lo que todavía me desconcierta).

Stubburn a un fallo, he intentado lo siguiente:

puse la cabecera ETag en todas las páginas salientes que quiero ser en caché (Recojo algunos argumentos URL opción que representan los datos que estoy solicitando y solo use eso para el valor Etag)

Al comienzo de la próxima solicitud, simplemente verifico si el encabezado 'If-None-Match' está en la solicitud. Si es así, entonces el navegador no está almacenando en caché la solicitud como yo quería, así que envié una respuesta 304 No modificada.

Las pruebas muestran que Firefox no va a almacenar en caché mi solicitud (pero todavía puedo evitar el 'recuperar los datos caros' parte de mi cgi), mientras que IE6 realmente almacenar en caché (y incluso no intentar ir a buscar detrás de la servidor).

No es una respuesta bonita, pero funciona para mí por ahora
(esas refrescantes actualizaciones de datos de gráficos a toda página no serán tan lentas ni costosas ahora).

(¿Qué? Estoy corriendo IE6! OMG! Oh, mira una ardilla!)

+0

Tal vez tengo que utilizar si-modified-since solicitudes para convertir éstos a HTTP 304 códigos de estado? – ericslaw

+0

maldito, ni siquiera los encabezados 'if-modified-since' enviados a petición ... tanto para el 304 enfoque – ericslaw

+0

Tuve un poco de suerte al configurar Etag en la solicitud inicial y devolver 304 si existe el encabezado 'If-None-Match' en solicitudes posteriores – ericslaw

Respuesta

0

Aunque no es el "caché del navegador" ¿qué pasa con el estado de sesión o de alguna otra forma de ahorro lado del cliente. De todos modos, tendrá que examinar una situación modificada desde que se menciona en su comentario.

El navegador no conocerá de forma nativa si los datos se han cambiado o no, ya que json recuperó dinámicamente y lo que está en la memoria caché es estático. ¿Creo?

1

La respuesta corta es no. Desafortunadamente, los navegadores no almacenan de manera confiable las solicitudes AJAX de la misma manera que hacen las páginas "normales".(Aunque los datos pueden de hecho ser almacenados en caché, el navegador a menudo no usa la caché cuando se manejan las solicitudes AJAX de la manera esperable.) Esto debería cambiar en el futuro, pero por ahora debe trabajar alrededor .

+1

Sí. Es inconsistente en el mejor de los casos. A veces lo hacen cuando menos lo esperas. – jason

1

Es posible que desee comprobar sus recursos utilizando el Resource Expert Droid, para asegurarse de que están haciendo lo que pretende. También debe ejecutar un seguimiento de red para verificar los encabezados de solicitud y respuesta, usando algo como Wireshark, en caso de que Firebug no cuente la historia completa.

Es posible que jQuery incluya algunos encabezados de solicitud de una manera que el navegador decide que debe omitir el caché. ¿Has probado un simple XMLHTTPRequest sin un marco?

+0

sitio web no es público, por lo que no puede utilizar redbot, pero gracias. wireshark muestra los mismos encabezados que muestra firebug. No he intentado XMLHTTPRequest directamente (¿apunta a un instructivo para eso?) – ericslaw

+0

La clásica referencia de XMLHTTPRequest: http://developer.apple.com/internet/webcontent/xmlhttpreq.html Si está realmente interesado, puede instalar redbot localmente – Carey

Cuestiones relacionadas