在GWT中永久缓存图像

3

浏览器中缓存和永久缓存的区别是什么?在GWT框架中,图像文件重命名为.cache.模式,我在谷歌网站上读到过,要使GWT配置的应用程序服务器永久缓存图像。但我不知道具体如何操作。我的网站图片不会改变,希望永久缓存它们,而不进行任何版本检查(以获得最佳性能)。 此致

2个回答

3
缓存由HTTP头控制。如果您想要浏览器缓存图像等内容,必须发送适当的头文件。ImageBundle只是将图像捆绑在一起,创建精灵以最小化HTTP请求。
GWT仅标记应缓存(.cache.)和不应缓存(.nocache.)的文件。设置适当的HTTP头是您服务器的责任(实际上是您配置服务器的责任!)。
Google在本文末尾解释了“完美缓存”: http://code.google.com/webtoolkit/doc/latest/DevGuideCompilingAndDebugging.html 此外,这里有一篇关于HTTP缓存头和浏览器/代理兼容性的好(通用)文章: https://code.google.com/p/doctype-mirror/wiki/ArticleHttpCaching Glassfish
您需要为Glassfish实现一个过滤器并在web.xml中进行配置。
我不会在这个答案中详细解释,但请查看这篇博客文章: http://blogs.oracle.com/cwebster/entry/caching_static_resources_in_glassfish 它在结尾处有一个过滤器类的链接。

但是我认为当我们在GWT中使用ImageBundle时,我们不需要考虑永久缓存,因为当我们的图像绑定在一个更大的单个图像中时,这意味着这些图像应该被缓存,那么为什么我们必须创建过滤器并配置App-Server?! - Nav
我更新了我的回答,但刚才也看到@Cesar已经回复了。 - fotos

1

ClientBundle 在 GWT 2.0 中引入,允许您将图像和其他资源捆绑在一个文件中,该文件永久缓存,从而减少服务器请求。

话虽如此,GWT 引入了一个称为完美缓存的概念。它通过将应用程序分成几个文件,命名为类似于 .cache.html 的文件,并且 md5 部分始终在应用程序代码或资源更改时更改来工作。然后有引导脚本,其中包含查找正确的 <md5>.cache.html 文件并加载它的逻辑。引导程序不应被缓存。

在您的应用程序服务器上,您需要进行以下配置(在此示例中为 Apache)

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

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

在这种情况下,它被设置为缓存一年。据我所知,没有设置永久缓存的选项,这只意味着超长的过期时间。

Tomcat缓存

就Tomcat而言,据我所知没有缓存控制,因此必须通过设置适当的HTTP标头来手动完成。这可以通过使用过滤器自动完成。

/*Please don't use this in production!*/
public class CacheFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
        throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        //cache everything for one year
        response.addHeader("Cache-Control", "max-age=31556926");
        chain.doFilter(request, response);
    }

    public void init(FilterConfig filterConfig) {
        this.fc = filterConfig;
    }

    public void destroy() {
        this.fc = null;
    }
}

然后在Tomcat或其衍生产品(如GlassFish)中的web.xml文件中映射过滤器:

<filter>
    <filter-name>cachingFilter</filter-name>
    <filter-class>CacheFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>cachingFilter</filter-name> 
    <url-pattern>*.cache.*</url-pattern>  
</filter-mapping>

你能否请教我如何在Glassfish中进行配置? - Nav
我不确定,但似乎Glassfish使用Tomcat的衍生版本作为其HTTP / Servlet容器。如果是这种情况,我认为您需要创建一个过滤器,并为*.nocache..cache.*文件添加Cache-Control HTTP标头。 - Cesar
但是我认为当我们在GWT中使用ImageBundle时,我们不需要考虑永久缓存,因为当我们的图像绑定在一个更大的单个图像中时,这意味着这些图像应该被缓存,那么为什么我们必须创建过滤器并配置App-Server? - Nav
当您使用ImageBundle时,GWT将所有图像绑定到一个更大的图像中。但是,取决于您的服务器设置,该单个图像将被缓存还是不会被缓存。ClientBundle的主要优点是单个下载(提高性能)与多个较小下载相比,而不是缓存控制。您的缓存设置仍然必须正确配置。 - Cesar

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