2011-09-01 26 views
0

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

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

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

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

它再也没有在Firefox ATLEAST重新加载。有什么建议么?我错过了什么?

更新标题:

矿:http://i.imgur.com/ikfVL.png

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

+0

“有时”意味着它有时只会重新加载或总是重新加载? – home

+0

有时候,但我不是在谈论硬性刷新。我意识到,Facebook的链接抛出一个304没有修改标题,因为我的总是200好 –

+1

这似乎是一个重复http://stackoverflow.com/questions/2872613/caching-images-served-by-servlet –

回答

1

比较头你就错过Last-Modified场。在回复中设置此字段很可能会导致浏览器下次请求图片If-Modified-Since请求标题字段。

如果没有改变,你可以用304 Not Modified来回应。

另外,您可以使用E-Tag而不是使用Last-Modified标题,以便更好地满足您的需求。


但我想知道你的图像没有像你这样做被缓存。据我所知你正在做最积极的缓存,导致大多数浏览器甚至不需要询问更新的版本,直到expires导致完全没有请求。这是可能的最积极的缓存。

它没有被缓存的一个原因可能是你调用你的servlet的URL。它是什么样子的?

+0

我已更新我的帖子与标题。问题,我该如何返回304未修改? –

+0

你可以用'resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED)'来设置它,其中resp是'HttpServletResponse'的一个实例。希望能帮助到你。 –

+0

如何知道何时返回SC_NOT_MODIFIED?我的意思是至少有一次,我需要返回状态200与实际的代码权利。如何检查If-Modified-Since标签是否已设置?你能指导我的代码? –