代码之家  ›  专栏  ›  技术社区  ›  Shadowman

浏览器缓存的Servlet过滤器?

  •  11
  • Shadowman  · 技术社区  · 14 年前

    有人知道如何编写servlet过滤器,为给定的文件/内容类型的响应设置缓存头吗?我有一个可以提供大量图片的应用程序,我想通过让浏览器缓存那些不经常更改的图片来减少托管的带宽。理想情况下,我希望能够指定一个内容类型,并让它在内容类型匹配时设置适当的头。

    2 回复  |  直到 14 年前
        1
  •  18
  •   Community Mr_and_Mrs_D    7 年前

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

    其中响应包装器如下所示:

    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);
        }
    }
    

    简而言之,这将创建一个响应包装器,在设置内容类型时,它将添加expires头(如果需要,还可以添加任何其他标题)。我一直在使用这个过滤器+包装,它的作品。

    See this question 在一个具体的问题,这解决了,原来的解决方案由巴卢斯。