[JSF] ブラウザキャッシュを無効にする

Aug 8, 2018   #Java  #JSF 

JSFでブラウザのキャッシュを無効にする方法。JSFでプロジェクトを始めるたびに検索するのがいい加減面倒になった、というわけでメモ。 javax.faces.event.PhaseListener を実装したクラスで処理するので、一つ作っておけば全てのレスポンスに適用されます。 作ったクラスは faces-config.xml に登録します。 以下、必要最低限のコード。

CacheControlPhaseListener.java
package io.github.kokuzawa.faces;

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
{
    @Override
    public void afterPhase(PhaseEvent phaseEvent)
    {
    }

    @Override
    public void beforePhase(PhaseEvent phaseEvent)
    {
        final FacesContext facesContext = phaseEvent.getFacesContext();
        final 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");
    }

    @Override
    public PhaseId getPhaseId()
    {
        return PhaseId.RENDER_RESPONSE;
    }
}
faces-config.xml
<lifecycle>
    <phase-listener>io.github.kokuzawa.faces.CacheControlPhaseListener</phase-listener>
</lifecycle>