2010-04-01 8 views
8

Quiero configurar el encabezado Expires para todos image/* y text/css. Estoy haciendo esto en un Filter. Sin embargo:Cómo agregar encabezados de respuesta en función del tipo de contenido; obtener Content-type antes de que se haya confirmado la respuesta

  • antes de llamar el tipo de contenido no está todavía "se dio cuenta"
  • después de llamar el tipo de contenido se establece, pero también lo es el contenido de longitud, que prohíbe la adición de nuevas cabeceras (al menos en aplicación Tomcat)

puedo usar las extensiones del recurso solicitado, pero ya que algunos de los archivos CSS son generados por richfaces llevándolos desde el interior de jar-archivos, el nombre del archivo no es x.css, pero es /xx/yy/zz.xcss/DATB/....

Entonces, ¿hay alguna manera de obtener el tipo de contenido antes de confirmar la respuesta?

Respuesta

13

Sí, implemente HttpServletResponseWrapper e invalide setContentType().

class AddExpiresHeader extends HttpServletResponseWrapper { 
    private static final long ONE_WEEK_IN_MILLIS = 604800000L; 

    public AddExpiresHeader(HttpServletResponse response) { 
     super(response); 
    } 

    public void setContentType(String type) { 
     if (type.startsWith("text") || type.startsWith("image")) { 
      super.setDateHeader("Expires", System.currentTimeMillis() + ONE_WEEK_IN_MILLIS); 
     } 
     super.setContentType(type); 
    } 
} 

y utilizarlo como sigue:

chain.doFilter(request, new AddExpiresHeader((HttpServletResponse) response)); 
+0

por supuesto ... Debería haber pensado en esto ... especialmente cuando uso otra envoltura en el mismo filtro (por otra razón) ... :) – Bozho

+0

(solo que no sería 0, pero será un momento en el futuro) – Bozho

+0

Sí, por supuesto. ¿O usas JodaTime? ;) – BalusC

2

Debe subclase HttpServletResponseWrapper y anular addHeader y setHeader para agregar el encabezado recién deseado cuando se pasa "Content-Type" como el nombre del encabezado. Asegúrate de no olvidar llamar súper a esos métodos anulados también. Envuelva la respuesta enviada en el argumento del método doFilter con este nuevo Wrapper y pase el Wrapper a la llamada a doFilter.

+0

(+1) tuya y respuestas de BalusC son ambas soluciones correctas, pero el suyo es un poco más limpio (al menos para mí, ya que una no tan el método general está anulado) – Bozho

+0

Sí, me olvidé del método setContentType. Es posible que desee considerar hacer lo mismo para setHeader y addHeader ya que nunca se sabe cómo podría codificarse. A menos, por supuesto, que sea el propietario de todo el código. – laz

Cuestiones relacionadas