代码之家  ›  专栏  ›  技术社区  ›  DD.

JSF缓存静态资源筛选器

  •  15
  • DD.  · 技术社区  · 13 年前

    我如何编写一个过滤器,根据谷歌的建议适当缓存静态资源( https://developers.google.com/speed/docs/best-practices/caching ).

    创建一个过滤器,将上次修改的日期设置为某个静态日期(每次服务器重新启动时都会更改),这是否足够?

    重要的是指定Expires或Cache Control最大年龄之一, 以及用于所有可缓存资源的Last Modified或ETag中的一个。它是 多余以同时指定“过期”和“缓存控制”:最大期限,或 同时指定Last Modified和ETag。

    上面的链接似乎建议您需要指定“过期”或“缓存控制”。为什么这是必要的?

    3 回复  |  直到 13 年前
        1
  •  27
  •   Community Mohan Dere    9 年前

    我如何编写一个过滤器,根据谷歌的建议适当缓存静态资源

    如果您指的是JSF资源中的文件 /resources 由JSF内置资源处理程序完全处理的文件夹( and thus all referenced via <h:outputStylesheet> , <h:outputScript> , <h:graphicImage> , #{resource} and thus not via the plain HTML way ),则不需要为该作业自行设置筛选器。为了满足谷歌的推荐,你唯一需要做的就是设置 Expires 日期在未来稍晚。也就是说,它默认为7天(604800000毫秒),而谷歌页面速度和雅虎YSlow等性能测试工具建议至少为30天(2592000000毫秒)。

    在Mojarra中,您可以在中使用以下上下文参数进行设置 web.xml :

    <context-param>
        <param-name>com.sun.faces.defaultResourceMaxAge</param-name>
        <param-value>2592000000</param-value> <!-- 30 days -->  
    </context-param>
    

    在MyFaces中使用以下内容:

    <context-param>
        <param-name>org.apache.myfaces.RESOURCE_MAX_TIME_EXPIRES</param-name>
        <param-value>2592000000</param-value> <!-- 30 days -->  
    </context-param>
    

    创建一个过滤器,将上次修改的日期设置为某个静态日期(每次服务器重新启动时都会更改),这是否足够?

    你不需要也不应该设置 Last-Modified JSF资源处理程序已经自动执行了。如果您想强制资源重新加载,因为您更改了它们,那么请使用资源库版本控制。另请参阅 What is the JSF resource library for and how should it be used?

    请注意,每次服务器重新启动时更改它是没有意义的,因为 到期 头仍然会一直告诉浏览器只在一段时间后重新测试缓存的有效性。在浏览器实际请求资源之前,浏览器永远不会注意到 上次修改时间 资源的。唯一迫使浏览器很难完全重新请求资源的是URL的更改,通常通过更改查询字符串参数值来实现。JSF资源库版本控制正是这样做的。

    还要注意的是 OmniFaces CombinedResourceHandler 在查询字符串中使用资源上次修改的时间戳作为“资源版本”,而不是资源库版本。所以,如果您正在使用它,就不一定需要资源库版本控制机制。


    上面的链接似乎建议您需要指定“过期”或“缓存控制”。为什么这是必要的?

    这个 到期 报头告诉浏览器何时通过条件GET请求重新测试缓存资源的有效性。所以,在那之前,浏览器不会这么做,而是会继续使用缓存中的那个。这个 Cache-Control 告诉浏览器要使用哪种缓存策略。请注意,当设置为例如。 no-cache 而不是 public ,然后 到期 标头不会有任何效果。另请注意 缓存控制 标头暗示 平民的 (正如JSF资源所做的那样)。

        2
  •  6
  •   Community Mohan Dere    9 年前

    以下是我如何编写缓存筛选器的。工作起来很有魅力。

    编写缓存过滤器以提高JSF/Servlet屏幕静态内容的性能

    在web.xml中添加以下内容

    <filter>
        <filter-name>cache</filter-name>
        <filter-class>au.com.webapp.config.CacheFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>cache</filter-name>
        <url-pattern>*.xhtml</url-pattern>
    </filter-mapping>
    

    在au.com.webapp.config包中创建一个类CacheFilter,如下所示:

    package au.com.webapp.config;
    
    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class CacheFilter implements Filter {
        private static long maxAge = 86400 * 30; // 30 days in seconds
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            String uri = ((HttpServletRequest) request).getRequestURI();
            if (uri.contains(".js") || uri.contains(".css") || uri.contains(".svg") || uri.contains(".gif")
                    || uri.contains(".woff") || uri.contains(".png")) {
                httpResponse.setHeader("Cache-Control", "max-age=" + maxAge);
            }
            chain.doFilter(request, response);
        }
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("Cache Filter started: ");
    
        }
    
        @Override
        public void destroy() {
        }
    }
    

    如何验证我的屏幕是否正在使用缓存

    要查看您的内容是否已使用gzip和缓存,请在 谷歌浏览器 浏览器->右键单击屏幕->检查->单击“网络”选项卡->刷新屏幕。 点击图片、图标、样式表,看看你是否在 响应标头

    Cache-Control:max-age=2592000

    此外,当您刷新页面时,如果元素的状态是304而不是200(来自缓存),那么您就完成了。

    其他性能改进,如gzip

    请参阅下面的链接,了解其他简单的性能改进,这些改进可以显著改变您的网络应用程序或网站性能,例如gzip或JQuery UI组件。 https://stackoverflow.com/a/35567464/5076414

        3
  •  -1
  •   Omirp    13 年前

    不需要编写Filter,Tomcat7已经有了ExpiryFilter,它可以将Cache Control添加到您的资源中。它可以基于修改或访问时间。查看此博客:

    http://kahimyang.info/kauswagan/howto_blogs/1574-improving_page_load_with_mod_expires_and_expiresfilter_in_jsf_applications

    推荐文章