在GWT中永久缓存图像

时间:2010-07-18 19:18:42

标签: gwt image caching image-manipulation

缓存和放大器之间有什么区别?永久缓存在浏览器中。 在GWT框架中,图像文件重命名为 .cache。模式,我在谷歌网站的某个地方读取,以便在GWT中永久缓存图像,配置App-Server永久缓存它们。 但我不知道该怎么做。 我的网站的图片永远不会改变,我想永远缓存它们而不进行任何版本检查(以获得最佳性能) 您诚挚的

2 个答案:

答案 0 :(得分: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的

您需要实现一个过滤器并在web.xml中为Glassfish配置它。

我不会在这个答案中详细介绍,但请看一下这篇博文: http://blogs.oracle.com/cwebster/entry/caching_static_resources_in_glassfish

最后有filter class的链接。

答案 1 :(得分:1)

GWT 2.0中引入的

ClientBundle允许您将图像和其他资源捆绑在一个文件中,此文件永远缓存,从而减少了服务器请求。

话虽如此,GWT引入了一个他们称之为完美缓存的概念。它的工作原理是将您的应用程序拆分为几个名为.cache.html的文件,并且当您的应用程序代码或资源发生更改时,md5部分始终会更改。然后是bootstrap脚本,其中包含查找正确的<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中映射过滤器或在web.xml中映射衍生物(例如glassfish):

<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>