2010-05-20 9 views
8

Estoy publicando imágenes de mi servlet. El tipo de contenido de respuesta es image/jpeg. Encuentro que las imágenes solicitadas desde mi servlet no están en la memoria caché. ¿Cómo puedo hacer que se almacenen en caché, como suelen ser las solicitudes de imágenes de archivo? Intenté configurar Cache-Control: public, pero fue en vano.almacenamiento en caché de imágenes servidas por servlet

Respuesta

-8

Ok .. Parece que los campos de cabecera por defecto debería permitir el almacenamiento en caché. Encontré una solución en otro foro. Aparentemente, debe establecer explícitamente una longitud de contenido en la respuesta. Me pregunto por qué sin embargo. Pensé que HttpServletResponse haría eso por nosotros. De todos modos, funcionó como un amuleto y la imagen se almacena en caché muy bien.

+4

¿Tal vez podría proporcionar un enlace al foro donde encontró la respuesta? – Stewart

2

Por ejemplo, si desea almacenar en caché ellas durante 1 mes:

Calendar inOneMonth = Calendar.getInstance(); 
inOneMonth.add(Calendar.MONTH, 1); 

response.setDateHeader("Expires", inOneMonth.getTimeInMillis()); 

(esto es en un Filter que maneja el patrón *.jpg, por ejemplo)

Pero las imágenes deben almacenarse en caché de forma predeterminada - verifique sus filtros y configuraciones para ver si algo no está configurando los parámetros de la memoria caché incorrectamente.

3

Debe enviar los encabezados ETag, Last-Modified y Expires a lo largo de la respuesta. El ETag representa el identificador único del archivo (generalmente compuesto en base a una combinación de nombre de archivo, tamaño de archivo y sello de tiempo modificado por última vez). El Last-Modified representa la última marca de tiempo modificada del archivo. El encabezado Expires indica cuánto tiempo se le permite al cliente mantener el archivo en caché. Si la memoria caché ha caducado y están disponibles ETag o Last-Modified, el cliente enviará una solicitud HEAD para verificar si el archivo necesita ser renovado. Si no es así, entonces el Expires se pospondrá de nuevo en consecuencia.

Usted puede encontrar aquí un ejemplo de servlet que se ocupa de todo esto (y reanuda la descarga y GZIP automática): FileServlet supporting resume and GZIP

22

El servlet por defecto servir contenido estático en contenedores como Tomcat no establece encabezados de control de caché. No necesita escribir un servlet solo para eso. Basta con crear un filtro de este tipo,

public void doFilter(ServletRequest request, 
     ServletResponse response, 
     FilterChain chain) 
    throws IOException, ServletException { 

    long expiry = new Date().getTime() + cacheAge*1000; 

    HttpServletResponse httpResponse = (HttpServletResponse)response; 
    httpResponse.setDateHeader("Expires", expiry); 
    httpResponse.setHeader("Cache-Control", "max-age="+ cacheAge); 

    chain.doFilter(request, response); 

} 

Cada vez que desee agregar control de caché, sólo tiene que añadir el filtro a los recursos en web.xml. Por ejemplo,

<filter> 
    <filter-name>CacheControl</filter-name> 
    <filter-class>filters.CacheControlFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>CacheControl</filter-name> 
    <url-pattern>/images/*</url-pattern> 
</filter-mapping> 
+2

Los encabezados funcionan en milisegundos, por lo que 'cacheAge' es el número de segundos que desea que las cosas se guarden en caché. –

+2

¿Se puede usar este filtro para los archivos css y javascript también? – Shadow

Cuestiones relacionadas