DD.*_*DD. 15 jsf browser-cache servlet-filters
如何编写一个过滤器,根据Google的建议(https://developers.google.com/speed/docs/best-practices/caching)适当缓存静态资源.
是否足以创建一个过滤器,将过去修改的日期设置为某个静态日期(每次服务器重新启动时都会更改)?
为所有可缓存资源指定Expires或Cache-Control max-age之一以及Last-Modified或ETag之一非常重要.指定Expires和Cache-Control:max-age或指定Last-Modified和ETag都是多余的.
上面的链接似乎建议您需要指定Expires或Cache-Control.为什么这有必要?
Bal*_*usC 26
如何编写一个过滤器,根据Google的建议适当缓存静态资源
如果你使用JSF资源指的是在文件/resources夹它完全由JSF内置的资源处理(处理,因此所有这些都通过引用<h:outputStylesheet>,<h:outputScript>,<h:graphicImage>,#{resource}不是通过普通的HTML的方式,因此),那么你并不需要homegrow的过滤器工作.要满足Google建议,您唯一需要做的就是将Expires日期设置得更远.它默认为7天(604800000毫秒),而Google Page Speed和Yahoo YSlow等性能测试工具建议至少30天(2592000000毫秒).
在Mojarra中,您可以使用以下上下文参数进行设置web.xml:
<context-param>
<param-name>com.sun.faces.defaultResourceMaxAge</param-name>
<param-value>2592000000</param-value> <!-- 30 days -->
</context-param>
Run Code Online (Sandbox Code Playgroud)
在MyFaces中有以下一个:
<context-param>
<param-name>org.apache.myfaces.RESOURCE_MAX_TIME_EXPIRES</param-name>
<param-value>2592000000</param-value> <!-- 30 days -->
</context-param>
Run Code Online (Sandbox Code Playgroud)
是否足以创建一个过滤器,将过去修改的日期设置为某个静态日期(每次服务器重新启动时都会更改)?
你不需要也不应该设置Last-Modified.JSF资源处理程序已经自动执行了此操作.如果您因为更改了资源而强制按资源重新加载,则使用资源库版本控制.另请参见什么是JSF资源库以及如何使用它?
请注意,每次服务器重新启动时更改它都没有意义,因为Expires标头仍然会告诉浏览器仅在一段时间后重新测试缓存的有效性.在浏览器实际请求资源之前,浏览器永远不会注意到Last-Modified资源的变化.迫使浏览器难以完全重新请求资源的唯一因素是URL的更改,通常通过更改的查询字符串参数值来实现.JSF资源库版本控制就是这样做的.
另请注意,OmniFacesCombinedResourceHandler使用资源的上次修改时间戳作为查询字符串中的"资源版本"而不是资源库版本.因此,如果您正在使用它,则不一定需要资源库版本控制机制.
上面的链接似乎建议您需要指定Expires或Cache-Control.为什么这有必要?
该Expires头告诉浏览器在被有条件GET请求重新测试缓存资源的有效性.因此,在此之前,浏览器不会这样做,并将继续使用缓存中的那个.该Cache-Control通知要使用的缓存策略浏览器.请注意,当它设置为例如no-cache而不是public,则Expires标题将不起作用.另请注意,缺少Cache-Control标头意味着public(由JSF资源完成).
这是我编写缓存过滤器的方式。奇迹般有效。
在您的 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>
Run Code Online (Sandbox Code Playgroud)
在 au.com.webapp.config 包中创建一个 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() {
}
}
Run Code Online (Sandbox Code Playgroud)
要查看您的内容是否已使用 gzip 和缓存,请在Google Chrome浏览器中 -> 右键单击屏幕 -> 检查 -> 单击网络选项卡 -> 刷新屏幕。单击图像、图标、样式表,看看是否在响应标题中看到以下内容
Cache-Control:max-age=2592000
另外,当您刷新页面时,如果元素的状态是 304 而不是 200(来自缓存),则您已完成。
请参阅以下链接,了解其他简单的性能改进,这些改进可以显着改变您的 web 应用程序或网站性能,例如 gzip 或 JQuery UI 组件。 /sf/answers/2489722511/
| 归档时间: |
|
| 查看次数: |
13906 次 |
| 最近记录: |