缓存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/*
您需要在响应中发送ETag
, Last-Modified
和Expires
标头。 ETag
表示文件的唯一标识符(通常基于文件名,文件大小和最后修改的时间戳的组合组成)。 Last-Modified
表示文件的上次修改时间戳。 Expires
标头表示允许客户端将文件保留在缓存中的时间。 如果缓存已过期并且ETag
或Last-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会为我们做那件事。 无论如何,它就像一个魅力,图像得到很好的缓存。