JSF2 静态资源缓存

Posted

技术标签:

【中文标题】JSF2 静态资源缓存【英文标题】:JSF2 Static resource caching 【发布时间】:2012-05-08 22:16:52 【问题描述】:

Glassfish 3.1.2、Mojarra 2.1.6、SSL 激活

我有一个关于静态资源缓存的问题。我已经阅读了一些关于此的帖子,但我不确定我们应该使用哪些选项。这个

https://developers.google.com/speed/docs/best-practices/caching

也是一篇关于资源缓存的好文章。在我们的应用服务器中 SSL 被激活。我们看到静态资源(图像、脚本、css)没有被缓存。

这是我的测试过滤器:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
    if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) 
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        String uri = httpRequest.getRequestURI();
        if (GET_METHOD.equalsIgnoreCase(httpRequest.getMethod()) && uri.contains(ResourceHandler.RESOURCE_IDENTIFIER)) 
            httpResponse.setDateHeader("Expires", System.currentTimeMillis() + 2419200000L); // 1 month in future.
            httpResponse.setDateHeader("Last-Modified", System.currentTimeMillis() - 2419200000L); // 1 month in past.
            httpResponse.setHeader("Cache-Control", "public"); // Secure caching
        
    
    chain.doFilter(request, response);

过期:好的。它是一种不会更改的静态资源,因此我们将到期日期设置为未来一个月。 最后修改:不确定。我读过将其设置为过去也会影响缓存 缓存控制:好的。允许安全缓存。安全影响?

此设置有什么影响吗?我还阅读了很多帖子,其中应通过过滤器禁用缓存。我看到的唯一问题是用户可能在新版本上遇到问题。新版本中可以更改样式和脚本,但浏览器会忽略新版本并使用缓存中的文件。

【问题讨论】:

【参考方案1】:

您只需要设置Cache-ControlExpiresLast-Modified已经默认设置为 ResourceHandler(并且会覆盖过滤器设置的值)。 Last-Modified 必须代表相关资源的最后修改时间戳。您可以通过servletContext.getResource(path).openConnection().getLastModified()获取。但无论如何你都不需要在这里设置它。就让ResourceHandler处理吧。

至于版本控制,只要正确使用资源库即可。您可以将与正则表达式模式\d+(_\d+)* 匹配的版本文件夹放在库文件夹中,ResourceHandler 将提供最新版本。

例如

/resources/libraryname/1_0/js/file.js
/resources/libraryname/1_1/js/file.js
/resources/libraryname/1_2/js/file.js

接下来会从1_2得到一个:

<h:outputScript library="libraryname" name="js/file.js" />

【讨论】:

以上是关于JSF2 静态资源缓存的主要内容,如果未能解决你的问题,请参考以下文章

前端静态资源缓存控制策略浅析

nginx缓存静态资源,只需几个配置提升10倍页面加载速度

HTTP静态资源缓存永远策略

Nginx实现静态资源的缓存

SpringBoot下静态资源处理

互联网企业静态资源的部署,如何充分利用浏览器缓存机制