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而不是publicExpires头将不起作用。 另外请注意, 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。 它可以基于修改或访问时间。 看到这个博客:

http://kahimyang.info/kauswagan/howto_blogs/1574-improving_page_load_with_mod_expires_and_expiresfilter_in_jsf_applications