在App Engine上的Servlet响应中覆盖与缓存相关的HTTP标头

icz*_*cza 6 java google-app-engine servlets http http-headers

我在App引擎上有一个servlet来提供图像.

servlet正确设置HTTP标头值以指示应缓存图像.但App Engine会覆盖这些标题,导致图像不被缓存.

请注意,之前相同的代码工作,但现在它不起作用.

App Engine的文档指出,如果Cache-Control,ExpiresVary报头由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
Run Code Online (Sandbox Code Playgroud)

(我已经尝试过把所有内容都注释掉了.)

检查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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,App Engine的刀片cache-control,expirespragma头禁用缓存.请注意,这是由于请求有一个cookie标头.但是,https://developers.google.com/appengine/docs/java/runtime#Responses上的文档 说明在这种情况下(设置cookie时),App引擎会将缓存配置为私有,因此浏览器仍然可以缓存它而不是中间代理服务器.除了谷歌分析代码(我已在页面上启用了谷歌分析),我甚至没有添加cookie.

我究竟做错了什么?如何实现servlet响应的正确缓存?

编辑: 进一步的调查显示,cookie被添加到请求中,因为我使用Google身份验证,如果用户使用他/她的Google帐户登录,则添加用户相关的cookie,这是可以理解的.如果没有用户登录,则不会覆盖缓存.所以我的进一步问题是:当用户使用Google帐户登录时,是否有办法缓存servlet提供的图像?

编辑,解决方案: 如果应用程序的管理员用户是客户端,则Google App Engine仅禁用缓存.在这种情况下,App Engine会自动插入仅供管理员使用的标头,例如请求的估计费用.这是私人信息,因此可以理解缓存是禁用的.

Pat*_*son 4

根据文档,只有当登录用户是管理员时才应覆盖标头。你检查过是否是这种情况吗?