【问题标题】:Servlet response should be cached but isn'tServlet 响应应该被缓存但不是
【发布时间】:2013-03-21 09:47:40
【问题描述】:

我正在尝试缓存 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

【问题讨论】:

标签: java caching servlets response


【解决方案1】:

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

  • If-Modified-Since:
  • 如果-未修改-自:

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

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

您可以在this excellent document 中阅读更多关于一般缓存的信息。

【讨论】:

  • 谢谢您,删除了 Last-Modified 标头,效果很好!
猜你喜欢
  • 2013-09-05
  • 2013-12-24
  • 1970-01-01
  • 2012-01-02
  • 2011-10-22
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多