JSFcaching静态资源filter
如何编写一个filter来适当地cachingGoogle推荐的静态资源( https://developers.google.com/speed/docs/best-practices/caching )。
创build一个将最后修改date设置为某个静态date的filter就足够了(每次服务器重新启动时都会更改)?
为所有可caching资源指定Expires或Cache-Control max-age之一,以及Last-Modified或ETag之一是很重要的。 指定Expires和Cache-Control:max-age,或指定Last-Modified和ETag都是多余的。
上面的链接似乎build议您需要指定过期或caching控制。 为什么这是必要的?
我该如何编写一个适当的cachingGoogle推荐的静态资源的filter
如果您的意思是JSF资源中的/resources JSF内置资源处理程序完全处理( 因此所有通过<h:outputStylesheet> , <h:outputScript> , <h:graphicImage> , #{resource}和因此不是通过简单的HTML方式 ),那么你不需要在工作中过滤一个filter。 为了满足Google的build议,您唯一需要做的就是将Expiresdate设置Expires 。 它默认为7天(604800000毫秒),而像Google Page Speed和Yahoo YSlow这样的性能testing工具推荐至less30天(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> 
创build一个将最后修改date设置为某个静态date的filter就足够了(每次服务器重新启动时都会更改)?
 你不需要也不需要设置Last-Modified 。  JSF资源处理程序已经自动执行。 如果您想要强制重新加载资源,请使用资源库版本控制。 另请参见什么是JSF资源库,以及如何使用它? 
 请注意,每当服务器重新启动时更改它是没有意义的,因为Expires标头仍然会一直告诉浏览器在一段时间后重新testingcaching的有效性。 在浏览器实际请求资源之前,浏览器永远不会注意到资源的Last-Modified中的更改。 唯一迫使浏览器难以完全重新请求资源的是URL的改变,通常通过改变的查询string参数值来实现。  JSF资源库版本控制就是这样做的。 
 另请注意, OmniFaces CombinedResourceHandler在查询string中使用资源的上次修改时间戳记作为“资源版本”,而不是资源库版本。 所以,如果你使用的是,你不一定需要资源库版本机制。 
上面的链接似乎build议您需要指定过期或caching控制。 为什么这是必要的?
  Expires头告诉浏览器何时通过条件GET请求重新testingcaching资源的有效性。 所以,直到那个时候浏览器不会这样做,并将继续使用caching中的一个。  Cache-Control告诉浏览器使用哪个caching策略。 请注意,当它设置为例如no-cache而不是public , Expires头将不起作用。 另外请注意, Cache-Control头的缺失意味着public (如JSF资源所做的那样)。 
这是我写我的cachingfilter。 奇迹般有效。
编写cachingfilter来提高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包中创build一个类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() { } } 
如何validation我的屏幕是否正在使用caching
要查看您的内容是否已经在使用gzip和caching,请在您的Google Chrome浏览器 – >右键单击您的屏幕 – >检查 – >点击networking标签 – >刷新您的屏幕。 点击图片,图标,样式表,看看你是否看到下面的响应标题
 Cache-Control:max-age=2592000 
同样,当你刷新页面时,如果元素的状态是304而不是200(来自caching),你就完成了。
其他性能改进,如gzip
请参考以下链接,获取更多简单的性能改进,这些改进可以显着改变您的web应用程序或网站性能,例如gzip或JQuery UI组件。 https://stackoverflow.com/a/35567464/5076414
无需编写filter,Tomcat 7已经有了将Cache-Control添加到资源的ExpiryFilter。 它可以基于修改或访问时间。 看到这个博客: