我正在尝试缓存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");
我现在也尝试使用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
答案 0 :(得分:5)
使用Last-Modified
需要在servlet中进行协作编码。当您将其发送到客户端时,该客户端将在请求相同资源时发回一个可能的标头集之一:
您必须处理这些标头,确定自给定日期以来内容是否已更改,如果没有,则发送304响应。大量的手工工作。另请注意,Last-Modified
日期必须为valid(例如:Tue, 15 Nov 1994 12:45:26 GMT
)。
最简单的方法是暂时忽略Last-Modified
,而使用Cache-Control
和Expires
标头。您的Expires
标头必须采用有效的日期格式,如Last-Modified
标头所述。
您可以在this excellent document中了解有关缓存的更多信息。