应该缓存Servlet响应,但不是

时间:2013-03-21 09:47:41

标签: java caching servlets response

我正在尝试缓存servlet响应但不知何故它不起作用(每次刷新页面时Firebug都给我200 OK)。这是我在servlet中添加的代码:

response.setContentType("application/javascript");
long now = System.currentTimeMillis();
response.setCharacterEncoding("UTF-8");
response.setDateHeader("Last-Modified", 0);
response.addHeader("Cache-Control", "max-age=5184000");
response.setDateHeader("Expires", now + 5184000 * 1000);
response.addHeader("Vary", "Host");

我现在也尝试使用setHeaderLast-Modified

似乎没什么用。有什么想法吗?

由于

这就是firebug向我展示响应/请求标头的方式(当资源应该从缓存中提取但不是时):

 Response Headersview source
 Cache-Control  max-age=5184000
 Connection Keep-Alive
 Content-Type   application/javascript;charset=UTF-8
 Date   Thu, 21 Mar 2013 09:53:48 GMT
 Expires    Sun, 31 Mar 2013 16:51:01 GMT
 Keep-Alive timeout=15, max=99



 Request Headersview source
 Accept */*
 Accept-Encoding    gzip, deflate
 Accept-Language    en-US,en;q=0.5
 Cache-Control  max-age=0

1 个答案:

答案 0 :(得分:5)

使用Last-Modified需要在servlet中进行协作编码。当您将其发送到客户端时,该客户端将在请求相同资源时发回一个可能的标头集之一:

  • If-Modified-Since:
  • If-Unmodified-Since:

您必须处理这些标头,确定自给定日期以来内容是否已更改,如果没有,则发送304响应。大量的手工工作。另请注意,Last-Modified日期必须为valid(例如:Tue, 15 Nov 1994 12:45:26 GMT)。

最简单的方法是暂时忽略Last-Modified,而使用Cache-ControlExpires标头。您的Expires标头必须采用有效的日期格式,如Last-Modified标头所述。

您可以在this excellent document中了解有关缓存的更多信息。