【发布时间】:2016-06-14 14:34:42
【问题描述】:
为了优化缓存,我在图像等的 src 值中添加了时间戳,例如<img src="/static/img/foo.1456871418309.png"/>.
然后我创建了一个 servlet 过滤器,它再次删除时间戳,然后将请求转发到资源。 request.getRequestDispatcher (urlWithoutTimestamp).forward(request, response).
并且在appengine-web.xml我指定缓存文件一年。
<static-files>
<include path="/static/**" expiration="365d" />
</static-files>
我认为,这样一来,用户将始终获得最新版本并可以缓存它,直到存在更新的版本,而无需通过 HTTP 对其进行测试。
在 localhost(作为 Web 应用程序运行)上,这工作正常,HTTP 响应具有预期的缓存标头:
Cache-Control:"public, max-age=31536000"
Expires:"Wed, 01 Mar 2017 22:54:32 GMT"
但是,当我在应用引擎服务器上部署整个内容时,响应具有此缓存标头(并且没有“过期”):
Cache-Control:"private"
除了转发请求,我还尝试在HttpServletRequestWrapper 上调用FilterChain 来修改getRequestURI、getRequestURL、getServletPath。这会导致同样糟糕的结果。
我怎样才能做到这一点?
更新:
再想一想,我想转发到静态内容可能是不可能的,因为转发总是在服务器本地完成,而静态内容很可能在另一台机器上提供。
但至少我能够用我的过滤器解决我的 HTTP 标头问题:
- 我没有转发请求,而是使用
HttpServletRequestWrapper(见上文)从请求中删除时间戳。 - 然后我在修改后的请求上调用chain.doFilter。
- 最后我在响应中设置了缓存头。
【问题讨论】:
标签: google-app-engine caching http-headers