缓存servlet提供的图像

我正在从我的servlet提供图像。 响应内容类型是image / jpeg。 我发现从我的servlet请求的图像没有被缓存。 如何通过文件图像请求缓存它们? 我尝试设置Cache-Control:public但无济于事。

在Tomcat等容器中提供静态内容的默认servlet不会设置任何缓存控制头。 您不需要为此编写servlet。 只需创建一个这样的filter,

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

无论何时需要添加缓存控制,只需将filter添加到web.xml中的资源即可。 例如,

  CacheControl filters.CacheControlFilter   CacheControl /images/*  

您需要在响应中发送ETagLast-ModifiedExpires标头。 ETag表示文件的唯一标识符(通常基于文件名,文件大小和最后修改的时间戳的组合组成)。 Last-Modified表示文件的上次修改时间戳。 Expires标头表示允许客户端将文件保留在缓存中的时间。 如果缓存已过期并且ETagLast-Modified可用,则客户端将发送HEAD请求以检查是否需要续订该文件。 如果没有,则Expires将再次相应推迟。

你可以在这里找到一个处理这一切的servlet示例(并下载简历和自动GZIP): FileServlet支持简历和GZIP

例如,如果要将它们缓存1个月:

 Calendar inOneMonth = Calendar.getInstance(); inOneMonth.add(Calendar.MONTH, 1); response.setDateHeader("Expires", inOneMonth.getTimeInMillis()); 

(例如,在处理*.jpg模式的Filter中)

但是默认情况下应该缓存图像 – 检查filter和配置以查看是否有些内容未正确设置缓存参数。

好..看起来默认的头字段应该启用缓存。 我在另一个论坛找到了解决方案。 显然,您需要在响应中明确设置内容长度。 不知道为什么。 我以为HttpServletResponse会为我们做那件事。 无论如何,它就像一个魅力,图像得到很好的缓存。