我有一个GWT应用程序已经部署到我们客户的机器上。随着不断地开发,我们需要不时推出新的改进版本。每次推出新版本时,我们经常会遇到一个问题,即客户端浏览器已经缓存了旧脚本,并且在一段时间内表现得很奇怪,因为它正在尝试使用与之不太兼容的数据。如何最好地解决这个问题?目前,我必须告诉用户清除浏览器缓存以获取新版本,但如果他们不必这样做就更好了。
可能的解决方案取决于您托管应用程序的方式。如果您直接从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的指令而不是指令。默认情况下,您的应用程序的大部分内容应由浏览器缓存,直到构建过程生成其新版本。
了解 GWT 引导模型可能对理解此过程有所帮助。
客户端请求的第一个脚本是 your-app-name.nocache.js
,该脚本不被缓存,仅检查浏览器的用户代理和功能,并发出请求获取相关应用程序 JS 的第二个脚本。
此时,如果已经请求过,则浏览器应缓存请求的脚本。这是一个名为{难以区分的数字和字母}.cache.html
的文件。
当您重新部署您的应用程序时,nocache.js
文件将被执行,并从服务器请求一个不在缓存中的不同的 cache.html
文件,但一旦下载完成,它就会被浏览器缓存。
您在使用延迟绑定或服务器缓存标头方面是否进行了任何不寻常的操作?这可能会导致您的 nocache.js
文件仍然被缓存,从而使其从浏览器缓存中请求旧的 cache.html
。