停止GWT应用中浏览器脚本缓存

15

我有一个GWT应用程序已经部署到我们客户的机器上。随着不断地开发,我们需要不时推出新的改进版本。每次推出新版本时,我们经常会遇到一个问题,即客户端浏览器已经缓存了旧脚本,并且在一段时间内表现得很奇怪,因为它正在尝试使用与之不太兼容的数据。如何最好地解决这个问题?目前,我必须告诉用户清除浏览器缓存以获取新版本,但如果他们不必这样做就更好了。

2个回答

15

可能的解决方案取决于您托管应用程序的方式。如果您直接从servlet容器进行托管,则可以使用类似于此处描述的servlet过滤器:

http://seewah.blogspot.com/2009/02/gwt-tips-2-nocachejs-getting-cached-in.html

这里是来自tadedon库的适当过滤器:

http://code.google.com/p/tadedon/source/browse/tadedon-servlet/src/main/java/com/xemantic/tadedon/servlet/CacheDisablingFilter.java

http://code.google.com/p/tadedon/source/browse/tadedon-servlet/src/main/java/com/xemantic/tadedon/servlet/CacheForcingFilter.java

这里是guice ServletModule,它使它们在整个guice web应用程序中可用:

http://code.google.com/p/tadedon/source/browse/tadedon-gwt/src/main/java/com/xemantic/tadedon/gwt/http/GwtHttpCachingModule.java

如果您在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的指令而不是指令。

14

默认情况下,您的应用程序的大部分内容应由浏览器缓存,直到构建过程生成其新版本。

了解 GWT 引导模型可能对理解此过程有所帮助。

客户端请求的第一个脚本是 your-app-name.nocache.js,该脚本不被缓存,仅检查浏览器的用户代理和功能,并发出请求获取相关应用程序 JS 的第二个脚本。

此时,如果已经请求过,则浏览器应缓存请求的脚本。这是一个名为{难以区分的数字和字母}.cache.html的文件。

当您重新部署您的应用程序时,nocache.js 文件将被执行,并从服务器请求一个不在缓存中的不同的 cache.html 文件,但一旦下载完成,它就会被浏览器缓存。

您在使用延迟绑定或服务器缓存标头方面是否进行了任何不寻常的操作?这可能会导致您的 nocache.js 文件仍然被缓存,从而使其从浏览器缓存中请求旧的 cache.html


2
Jason,看起来这是你的应用程序名称.nocache.js在浏览器中被缓存的副作用。Shahid必须配置他的服务器仅缓存*.cache.js而不缓存*.nocache.js。除此之外,你提到的所有内容都应该自动落实。 - Ashwin Prabhu
@jason-hall,你有什么想法可以在通过your-app-name.nocache.js加载的脚本的URL中注入一些哈希值吗?在我的情况下,your-app-name.nocache.js是正确地无缓存加载,但作为其结果加载的脚本仍然来自缓存。我想在每次构建时生成一个哈希值并将其添加到URL中... - Mabedan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接