【发布时间】:2011-03-25 08:56:58
【问题描述】:
我在我们客户的机器上部署了一个 GWT 应用程序。作为一个正在进行的 在开发的同时,我们必须发布新的改进版本 不时申请。每次我们发布新版本时,我们 经常遇到客户端浏览器缓存的问题 旧脚本 scriptsand 有一段时间它表现得像它的数据一样奇怪 正在尝试与它不完全兼容。是什么 克服这个问题的最佳方法。目前我必须告诉用户 清除浏览器的缓存以获取新版本,但这会很好 他们不必这样做。
【问题讨论】:
我在我们客户的机器上部署了一个 GWT 应用程序。作为一个正在进行的 在开发的同时,我们必须发布新的改进版本 不时申请。每次我们发布新版本时,我们 经常遇到客户端浏览器缓存的问题 旧脚本 scriptsand 有一段时间它表现得像它的数据一样奇怪 正在尝试与它不完全兼容。是什么 克服这个问题的最佳方法。目前我必须告诉用户 清除浏览器的缓存以获取新版本,但这会很好 他们不必这样做。
【问题讨论】:
默认情况下,您的应用程序的大部分内容应由浏览器缓存,直到您的构建过程生成它的新版本。
了解 GWT 引导模型以了解其工作原理可能会有所帮助。
您的客户端请求的第一个脚本 your-app-name.nocache.js 没有被缓存,它除了检查浏览器的用户代理和功能之外什么都不做,并为相关的应用 JS 发出第二个请求。
此时,它请求的脚本应该被浏览器缓存,如果它之前被请求过的话。这是一个{indistinguisable-numbers-and-letters}.cache.html 文件。
当你重新部署你的应用程序时,nocache.js 文件将被执行,并从服务器请求一个不同的cache.html 文件,该文件不会已经存在于缓存中,但是一旦它会被浏览器缓存已下载。
您是否对延迟绑定或在服务器上缓存标头做了什么不寻常的事情?毕竟这可能会导致您的nocache.js 文件被缓存,这将使它从浏览器缓存中请求旧的cache.htmls。
【讨论】:
可能的解决方案取决于您托管应用程序的方式。如果您直接从 servlet 容器托管,则可以使用此处描述的 servlet 过滤器:
http://seewah.blogspot.com/2009/02/gwt-tips-2-nocachejs-getting-cached-in.html
以下是来自 tadedon 库的适当过滤器:
这里是 guice ServletModule,它使它们能够用于整个 guice Web 应用程序:
如果你在 tomcat 前面使用了一些反向代理,那就更简单了。如果是 apache(例如 mod_proxy、mod_jk),并假设所有应用程序资源(html、图形、java 脚本、css 等)都放在 apache 上,只需在 apache 配置中设置这些选项:
<Files *.nocache.*>
ExpiresDefault "access"
</Files>
<Files *.cache.*>
ExpiresDefault "now plus 1 year"
</Files>
这里是这样描述的:
http://code.google.com/webtoolkit/doc/latest/DevGuideCompilingAndDebugging.html
在“完美缓存”部分。这种部署场景假设只有 rpc 请求应该通过反向代理到 tomcat。如果由于某些原因,所有应用程序上下文都代理到 tomcat,您仍然可以使用 apache 的 LocationMatch 指令而不是 Files 指令。
【讨论】: