我已经在App Engine上一个servlet供应的图像。
该servlet套HTTP标头值正确,表明图像应缓存。 但是App Engine的覆盖这些头导致没有被缓存的图像。
需要注意的是相同的代码工作过,但它不会有一段时间了工作。
App Engine的文档指出,如果Cache-Control
, Expires
和Vary
报头由servlet设置,他们将留不变: https://developers.google.com/appengine/docs/java/runtime#Responses
这是我的示例代码:
response.setContentType( "image/jpeg" );
//response.setDateHeader( "Expires", new Date().getTime() + 60L*24*60*60*1000 ); // 60 days cache time
//response.addHeader( "Cache-Control", "public, max-age=5184000" ); // 5_184_000 sec = 60 days cache time
response.addHeader( "Cache-Control", "public, max-age=90000" ); // 90_000 sec = 25 hours cache time
response.getOutputStream().write( data ); // Data is a byte array containing the JPEG image data
(我试过把所有的被注释掉)。
检查该HTTP请求响应,所述响应包含以下标题:
HTTP/1.1 200 OK
status: 200 OK
version: HTTP/1.1
cache-control: public, max-age=90000
cache-control: no-cache, must-revalidate
content-length: 6777
content-type: image/jpeg
date: Sat, 05 Jan 2013 14:11:47 GMT
expires: Fri, 01 Jan 1990 00:00:00 GMT
pragma: no-cache
server: Google Frontend
正如你所看到的,App Engine的插入cache-control
, expires
和pragma
头禁用缓存。 请注意,这是由于要求有一个cookie
头。 而且在文档https://developers.google.com/appengine/docs/java/runtime#Responses指出,在这种情况下(当cookie设置),应用程序引擎将配置缓存是私有的,从而浏览器仍然能够缓存,但没有中间代理服务器。 该饼干甚至不是我,而是谷歌Analytics(分析)代码添加(我已经启用网页上谷歌分析)。
我究竟做错了什么? 我如何能实现servlet响应的适当的缓存?
编辑:进一步的调查表明,cookie添加到请求,因为我使用谷歌身份验证,如果用户在使用他/她的谷歌帐户登录,用户相关的cookie被加入,可以理解。 如果没有用户登录,缓存没有被覆盖。 所以我进一步的问题是:有没有缓存在用户与谷歌帐户登录servlet的服务图像的方法吗?
编辑,SOLUTION:谷歌应用程序引擎只禁用缓存,如果应用程序的管理员用户是客户端。 在这种情况下,应用程序引擎自动插入仅用于管理员标头,例如请求的估计费用。 这是私人信息,因此是可以理解的缓存被禁用。