【问题标题】:Cache Control in JSFJSF 中的缓存控制
【发布时间】:2015-09-01 11:11:44
【问题描述】:

我有许多使用<ui:composition> 的JSF 页面。假设我有以下页面

  • common.xhtml(这里定义headbody。它是所有页面的父/主/首页)
  • p1.xhtml(包含在common.xhtml 中,使用<ui:composition>
  • p2.xhtml(包含在 common.xhtml 中,使用 <ui:composition>
  • p3.xhtml(包含在 common.xhtml 中使用 <ui:composition> 并且我想在此页面点击时重新加载 JF 和 css 文件)

我通过this 链接,但这对我没有帮助,因为我必须将标题放在common.xhtml 中(这将停止缓存所有 JF 和 CSS 文件,我不想要这个。)

p3.xhtml 命中时,我如何重新加载 js 和 css 文件?

编辑

我在common.xhtml添加了关注

<h:head>
   ....
   <ui:insert name="metaTags" />
</h:head>

我在p3.xhtml添加了关注

<ui:define name="metaTags">
    <meta http-equiv="cache-control" content="max-age=0" />
    <meta http-equiv="cache-control" content="no-cache" />
    <meta http-equiv="expires" content="0" />
    <meta http-equiv="pragma" content="no-cache" />
</ui:define>

但它仍然没有选择我更新的 js 文件。

【问题讨论】:

    标签: jsf caching jsf-2 facelets


    【解决方案1】:

    基于@BalusC 评论(感谢评论)我将完全重写我的答案:

    您不需要任何 Servlet,您可以将您的逻辑包含在任何实现 JSF 阶段侦听器的 JSF 生命周期阶段中。我已经根据您的问题调整了 here 的内容。

    你只需要在渲染阶段之前实现一个阶段监听器,并在 faces-config.xml 文件中声明它。

    声明:

    <lifecycle>
        <phase-listener id="nocache">com.company.package.CacheControlPhaseListener</phase-listener>
    </lifecycle>
    

    相位监听代码:

    import javax.faces.context.FacesContext;
    import javax.faces.event.PhaseEvent;
    import javax.faces.event.PhaseId;
    import javax.faces.event.PhaseListener;
    import javax.servlet.http.HttpServletResponse;
    
    public class CacheControlPhaseListener implements PhaseListener
    {
        private static final long serialVersionUID = 1L;
    
        @Override
        public PhaseId getPhaseId()
        {
            return PhaseId.RENDER_RESPONSE;
        }
    
        @Override
        public void afterPhase(PhaseEvent event)
        {
        }
    
        @Override
        public void beforePhase(PhaseEvent event)
        {
            FacesContext facesContext = event.getFacesContext();
            if("/p3.xhtml".equals(facesContext.getExternalContext().getRequestServletPath())){
                HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
                response.addHeader("Pragma", "no-cache");
                response.addHeader("Cache-Control", "no-cache");
                // Stronger according to blog comment below that references HTTP spec
                response.addHeader("Cache-Control", "no-store");
                response.addHeader("Cache-Control", "must-revalidate");
                // some date in the past
                response.addHeader("Expires", "Mon, 8 Aug 2006 10:00:00 GMT");
            }
        }
    }
    

    错误的初始答案:

    您可以在p3.xhtml 中写一个与此类似的define

    <ui:define name="nocache">
        <meta http-equiv=... />
        ...
    </ui:define>
    

    并在common.xhtml的头部写一个insert

    <ui:insert name="nocache" />*
    

    【讨论】:

    • 你在你的问题中说:“这将停止缓存所有 JF 和 CSS 文件,我不想要这个..”。你检查了吗?我想你已经把你在问题中引用的答案删掉了,你呢?
    • @BalusC 是否有任何标签是 JSF 可以帮助我或者我必须实现一个 servlet ?
    猜你喜欢
    • 2020-09-22
    • 2012-06-06
    • 2017-04-27
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    相关资源
    最近更新 更多