JSF2静态资源缓存

3

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个回答

7
你只需要设置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" />

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