应该缓存Servlet响应,但不是

Iul*_*anu 1 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");
Run Code Online (Sandbox Code Playgroud)

我现在也尝试过setHeader和使用过Last-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
Run Code Online (Sandbox Code Playgroud)

Per*_*ion 5

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

  • 如果-Modified-Since的:
  • 如果未修饰的,因为:

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

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

这篇优秀的文档中,您可以阅读更多关于缓存的内容.