【问题标题】:Stop browser scripts caching in GWT App停止 GWT 应用程序中的浏览器脚本缓存
【发布时间】:2011-03-25 08:56:58
【问题描述】:

我在我们客户的机器上部署了一个 GWT 应用程序。作为一个正在进行的 在开发的同时,我们必须发布新的改进版本 不时申请。每次我们发布新版本时,我们 经常遇到客户端浏览器缓存的问题 旧脚本 scriptsand 有一段时间它表现得像它的数据一样奇怪 正在尝试与它不完全兼容。是什么 克服这个问题的最佳方法。目前我必须告诉用户 清除浏览器的缓存以获取新版本,但这会很好 他们不必这样做。

【问题讨论】:

    标签: gwt browser caching


    【解决方案1】:

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

    了解 GWT 引导模型以了解其工作原理可能会有所帮助。

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

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

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

    您是否对延迟绑定或在服务器上缓存标头做了什么不寻常的事情?毕竟这可能会导致您的nocache.js 文件被缓存,这将使它从浏览器缓存中请求旧的cache.htmls。

    【讨论】:

    • Jason,看起来这是 your-app-name.nocache.js 被缓存在浏览器中的副作用。 Shahid 必须将他的服务器配置为仅缓存 *.cache.js 而不缓存 *.nocache.js。除此之外,您提到的所有内容都应该自动到位。
    • @jason-hall 关于如何向通过 your-app-name.nocache.js 加载的脚本的 url 注入一些哈希的任何想法?在我的情况下, your-app-name.nocache.js 被正确加载而没有缓存,但是由于它而加载的脚本仍然来自缓存。我想在每次构建时生成一个哈希并将其添加到 url...
    【解决方案2】:

    可能的解决方案取决于您托管应用程序的方式。如果您直接从 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 的 LocationMatch 指令而不是 Files 指令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      相关资源
      最近更新 更多