【问题标题】:Java Servlet Cache AggresivelyJava Servlet 积极缓存
【发布时间】:2011-09-01 09:14:05
【问题描述】:

我试图在调用 Java Servlet 链接时输出图像。目前使用以下:

response.addHeader("Cache-Control", "max-age=" + CACHE_INTERVAL);
response.addDateHeader("Expires", System.currentTimeMillis() + (1000*CACHE_INTERVAL));

但这仍然会导致图像有时从服务器重新加载。相比之下,如果你看看这个标签:

http://graph.facebook.com/502547234/picture

至少在 Firefox 中它永远不会重新加载。有什么建议么?我错过了什么?

更新的标题:

我的:http://i.imgur.com/ikfVL.png

FB:http://i.imgur.com/o0KsM.png

【问题讨论】:

  • “有时”是否意味着它仅“有时”或总是重新加载?
  • 有时但不是在谈论硬刷新。我意识到 Facebook 的链接会抛出一个 304 未修改的标题,而我的总是 200 OK
  • 您可以发布请求和响应标头吗?每人一次:缓存您的和 Facebook 缓存。
  • @Alec:在 Ashkan 的重复链接中查看我的答案。你需要考虑更多。您的 servlet 还需要支持 HEAD 请求并相应地响应 If-Modified-SinceIf-Match 请求。

标签: java jsp servlets


【解决方案1】:

比较您缺少的标题 Last-Modified 字段。在响应中设置此字段很可能会导致浏览器下次使用 If-Modified-Since 请求标头字段请求图像。

如果没有更改,您可以回复304 Not Modified

或者,您可以使用 E-Tag 而不是使用 Last-Modified 标头,因为它更适合您的需求。


但我想知道您的图像没有按照您的方式缓存。据我所知,您正在做最激进的缓存,导致大多数浏览器在expires 之前甚至都不要求更新版本,导致完全没有请求。这是可能的最激进的缓存。

它未被缓存的一个原因可能是您调用 servlet 的 URL。它看起来像什么?

【讨论】:

  • 我已经用标题更新了我的帖子。问题,如何返回未修改的 304?
  • 您可以使用resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED) 设置它,其中resp 是HttpServletResponse 的一个实例。希望对您有所帮助。
  • 我如何知道何时返回 SC_NOT_MODIFIED?我的意思是至少有一次我需要使用正确的实际代码返回状态 200。如何检查是否设置了 If-Modified-Since 标签?你能指导我使用代码吗?
  • 我不是要你做我的工作。我找不到任何关于标题标签的综合文档,所以我在寻求帮助。不确定何时返回 304 未修改的标头以及何时返回 200。无论哪种方式,我都会弄清楚。没必要粗鲁。
  • 问题是你没有表现出任何努力自己解决它并提出可以通过谷歌搜索几分钟或只需点击此处给出的链接即可回答的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 2013-03-06
  • 2015-10-14
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多