JSF2静态资源缓存

3 caching filter primefaces java-ee-6 jsf-2

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);
}
Run Code Online (Sandbox Code Playgroud)
  • 过期:好的.这是一个不会改变的静态资源,因此我们将过期日期设置为一个月.
  • 上次修改时间:不确定.我已经读过这个过去的设置也会影响缓存
  • 缓存控制:好的.允许安全缓存.安全影响?

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

Bal*_*usC 7

你只需要设置Cache-Control.该ExpiresLast-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
Run Code Online (Sandbox Code Playgroud)

以下将从以下方面获取1_2:

<h:outputScript library="libraryname" name="js/file.js" />
Run Code Online (Sandbox Code Playgroud)