在GWT App中停止浏览器脚本缓存

Sha*_*hid 15 browser gwt caching

我在客户的机器上部署了一个GWT应用程序.作为一项持续的开发,我们不得不不时发布应用程序的新改进版本.每当我们发布新版本时,我们经常会遇到客户端浏览器缓存旧脚本脚本的问题,并且有一段时间它会表现得很糟糕,因为它尝试使用的数据与它不完全兼容.解决这个问题的最佳方法是什么?目前我必须告诉用户清除他们的浏览器缓存以获得新版本,但是他们不必这样做会很好.

mor*_*sil 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>
Run Code Online (Sandbox Code Playgroud)

这里描述:

http://code.google.com/webtoolkit/doc/latest/DevGuideCompilingAndDebugging.html

在"完美缓存"部分.此类部署方案假定只有rpc请求应通过反向代理到tomcat.如果由于某些原因将所有应用程序上下文代理到tomcat,您仍然可以使用apache的LocationMatch指令而不是Files指令.


Jas*_*all 14

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

理解GWT引导模型可能有助于理解其工作原理.

客户端请求的第一个脚本your-app-name.nocache.js不会被缓存,除了检查浏览器的用户代理和功能外,它什么都不做,并对相关的应用程序JS发出第二个请求.

此时,如果之前已请求过,则它请求的脚本应由浏览器缓存.这是一个{indistinguisable-numbers-and-letters}.cache.html文件.

重新部署应用程序时,nocache.js将执行该文件,并要求提供cache.html与服务器不同的文件,该文件不会出现在缓存中,但下载后将由浏览器缓存.

您是否正在使用延迟绑定或服务器上的缓存标头执行任何异常操作?这可能会导致您的nocache.js文件被缓存,这将使它cache.html从浏览器缓存中请求旧的.

  • 杰森,看起来这是你的app-name.nocache.js在浏览器中缓存的副作用.Shahid必须将其服务器配置为仅缓存*.cache.js并且不缓存*.nocache.js.除此之外,你提到的一切都应该自动落实到位. (2认同)