3

在 Jboss6 服务器中的 Spring JSF facelets Web 应用程序中,出于安全原因,我需要确保某些网页不会被 Web 浏览器缓存。它也应该作为跨浏览器工作。当我在 Firefox 的 YSlow 插件中运行测试时,我发现了以下建议。

在此处输入图像描述

在我的 Web 应用程序中,我也设置了 Phaselistener 来禁用缓存。但是我仍然不明白为什么 YSlow 会给出这些结果,我想知道如何通过为这些静态组件设置遥远的未来到期日期来解决这个问题,并同时提高这个页面的性能。

缓存控制阶段监听器

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 仍然显示以下内容,

在此处输入图像描述

4

1 回答 1

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));

也可以看看:


与具体问题无关,您的缓存控制和编译指示标头告诉您根本不应该缓存这些资源。这是没有意义的。删除它们。此外,使用相位侦听器方法而不是过滤器方法也很笨拙。

于 2012-12-19T12:05:49.537 回答