Pregunta ¿Filtro de servlet para el almacenamiento en caché del navegador?


¿Alguien sabe cómo codificar un filtro de servlet que establecerá encabezados de caché en una respuesta para un tipo de archivo / contenido dado? Tengo una aplicación que sirve muchas imágenes, y me gustaría reducir el ancho de banda para alojarla teniendo el caché del navegador en las que no cambian muy a menudo. Idealmente, me gustaría poder especificar un tipo de contenido y hacer que establezca los encabezados apropiados cada vez que coincida el tipo de contenido.

¿Alguien sabe cómo hacer esto? O, mejor aún, ¿tienen un código de muestra que estarían dispuestos a compartir? ¡Gracias!


10
2017-07-30 19:24


origen


Respuestas:


En tu filtro tienes esta línea:

chain.doFilter(httpRequest, new AddExpiresHeaderResponse(httpResponse));

Donde el envoltorio de respuesta se ve así:

class AddExpiresHeaderResponse extends HttpServletResponseWrapper {

    public static final String[] CACHEABLE_CONTENT_TYPES = new String[] {
        "text/css", "text/javascript", "image/png", "image/jpeg",
        "image/gif", "image/jpg" };

    static {
        Arrays.sort(CACHEABLE_CONTENT_TYPES);
    }

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

    @Override
    public void setContentType(String contentType) {
        if (contentType != null && Arrays.binarySearch(CACHEABLE_CONTENT_TYPES, contentType) > -1) {
            Calendar inTwoMonths = GeneralUtils.createCalendar();
            inTwoMonths.add(Calendar.MONTH, 2);

            super.setDateHeader("Expires", inTwoMonths.getTimeInMillis());
        } else {
            super.setHeader("Expires", "-1");
            super.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        }
        super.setContentType(contentType);
    }
}

En resumen, esto crea una envoltura de respuesta que, al establecer el tipo de contenido, agrega el encabezado expira. (Si lo desea, puede agregar cualquier otro encabezado que necesite). He estado usando este filtro + envoltorio y funciona.

Ver esta pregunta en un problema específico que esto resuelve, y la solución original de BalusC.


16
2017-07-30 19:50



Aquí está la solución lista para esto https://github.com/samaxes/javaee-cache-filter


0
2018-02-24 12:14