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);
}
此设置是否有任何影响?我还阅读了很多帖子,其中应通过过滤器禁用缓存。我看到的唯一问题是用户可能在新版本上遇到问题。可以在新版本中更改样式和脚本,但浏览器会忽略新样式并使用缓存中的文件。
答案 0 :(得分:7)
您只需要设置Cache-Control
。默认ResourceHandler
Expires
和Last-Modified
已已设置(并将覆盖过滤器设置的值)。 Last-Modified
必须表示相关资源的上次修改时间戳。您可以servletContext.getResource(path).openConnection().getLastModified()
获取它。但无论如何你都不需要在这里设置它。只需让ResourceHandler
处理。
关于版本控制,只需正确使用资源库。您可以将匹配正则表达式模式\d+(_\d+)*
的版本文件夹放在库文件夹中,ResourceHandler
将提供最新版本。
E.g。
/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" />