在我的Jboss6服务器中的Spring JSF facelets Web应用程序中,出于安全原因,我需要确保Web浏览器不会缓存某些网页。它也应该作为跨浏览器工作。当我在firefox的YSlow插件中运行测试时,我发现了以下建议。
在我的Web应用程序中,我设置了Phaselistener来禁用缓存。但是我仍然无法理解为什么YSlow会给出这些结果,我想知道如何通过将远期未来的到期日期设置为这些静态组件并提高此页面的性能来解决此问题。
缓存控制phaselistener
public class CacheControlPhaseListener implements PhaseListener {
/**
*
*/
private static final long serialVersionUID = 1L;
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
public void afterPhase(PhaseEvent event) {
}
public void beforePhase(PhaseEvent event) {
FacesContext facesContext = event.getFacesContext();
HttpServletResponse response = (HttpServletResponse) facesContext
.getExternalContext().getResponse();
response.addHeader("Pragma", "no-cache");
response.addHeader("Cache-Control", "no-cache");
response.addHeader("Cache-Control", "no-store");
response.addHeader("Cache-Control", "must-revalidate");
response.addHeader("Expires", "Mon, 8 Aug 2006 10:00:00 GMT");
}
}
在faceconfig中
<lifecycle>
<phase-listener id="nocache">com.company.jsf.listener.CacheControlPhaseListener</phase-listener>
</lifecycle>
http标头
添加未来日期后,YSlow仍会显示以下内容,
答案 0 :(得分:4)
response.addHeader("Expires", "Mon, 8 Aug 2006 10:00:00 GMT");
2006年8月8日至今绝对不是“远期未来”的到期日。
您需要设置一个真正的远期到期日期,例如今天过了30天。
response.setDateHeader("Expires", System.currentTimeMillis() + (30 * 24 * 60 * 60 * 1000L));
无关,您的缓存控制和编译指示标头告诉我们应该根本不缓存这些资源。这毫无意义。删除它们。此外,使用阶段监听器方法而不是过滤器方法是笨拙的。