2010-08-04 54 views
15

我有一个GWT应用程序部署到我们客户的机器上。作为一个正在进行的 开发,我们必须不时发布新的改进版本的 应用程序。每次我们发布一个新版本时,我们通常会遇到这样的问题:客户端的浏览器已经缓存了 旧脚本脚本,并且一段时间它的行为蛮横,因为它尝试使用的数据与它不兼容。什么是 克服这个问题的最好方法。目前,我必须告诉用户 要清除浏览器的缓存以获得新版本,但它不会那么做,因此 不需要这样做。在GWT App中停止浏览器脚本缓存

回答

14

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

这可能有助于理解GWT引导模型,以了解其工作原理。

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

在这一点上,它所请求的脚本应该被浏览器缓存,如果之前已经被请求的话。这是一个{indistinguisable-numbers-and-letters}.cache.html文件。

当您重新部署应用程序时,将会执行nocache.js文件并向服务器索要不同的cache.html文件,该文件不会存在于缓存中,但是一旦下载,该文件就会被浏览器缓存。

你是否在做任何与延迟绑定或服务器缓存头文件不同的事情?这可能会导致您的nocache.js文件被缓存,这将使其从浏览器缓存中请求旧的cache.html

+2

Jason,它看起来像是你的app-name.nocache.js缓存在浏览器中的副作用。 Shahid必须将其服务器配置为仅缓存* .cache.js并且不缓存* .nocache.js。 除了你提到的所有东西都应该自动落实到位。 – 2010-08-05 07:00:44

+0

@ jason-hall关于如何向通过your-app-name.nocache.js加载的脚本的url注入一些散列的任何想法?在我的情况下,your-app-name.nocache.js在没有缓存的情况下被正确加载,但作为其结果加载的脚本仍然来自缓存。我想在每个构建生成一个哈希,并将其添加到网址... – Mabedan 2017-06-09 16:18:15

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等等在 “完美缓存” 部分

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

:)都穿上了Apache,只需设置在Apache配置这些选项:

<Files *.nocache.*> 
    ExpiresDefault "access" 
</Files> 

<Files *.cache.*> 
    ExpiresDefault "now plus 1 year" 
</Files> 

在此描述。这种部署方案假定只有rpc请求应该通过反向代理到tomcat。如果由于某些原因,所有的应用程序上下文都被代理到tomcat,你仍然可以使用Apache的LocationMatch指令而不是Files指令。