【问题标题】:Cache-related HTTP headers are overridden in Servlet response on App Engine缓存相关的 HTTP 标头在 App Engine 上的 Servlet 响应中被覆盖
【发布时间】:2012-12-19 19:31:14
【问题描述】:

我在提供图像的 App 引擎上有一个 servlet。

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

请注意,相同的代码以前可以工作,但现在有一段时间不能工作了。

App 引擎文档指出,如果 Cache-ControlExpiresVary 标头由 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-controlexpirespragma 标头禁用缓存。请注意,这是由于请求具有 cookie 标头。但也有文档 https://developers.google.com/appengine/docs/java/runtime#Responses 声明在这种情况下(设置 cookie 时),App 引擎会将缓存配置为私有,因此浏览器仍然可以缓存它,但不能缓存中间代理服务器。 Cookie 甚至不是我添加的,而是 Google Analytics 代码(我在页面上启用了 Google Analytics)。

我做错了什么?如何正确缓存 servlet 响应?

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

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

【问题讨论】:

  • 那是 25 小时,对吧? max-age 指定秒数。 90000 秒 = 1500 分钟 = 25 小时
  • @NagyI 是的,这是一个错字。

标签: java google-app-engine http servlets http-headers


【解决方案1】:

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

【讨论】:

  • 是的,就是这样。几周前我发现了它,只是忘记更新帖子了。现在就做。
  • 也接受你的答案,即使它已经解决了。
猜你喜欢
  • 2015-09-29
  • 2013-06-27
  • 2014-10-12
  • 2017-07-05
  • 2013-02-23
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 2020-11-15
相关资源
最近更新 更多