Como redirecionar para a página de login quando a sessão expira?

Eu tenho três módulos da web JSF 2.0 e preciso redirecionar para a página de login quando a sessão expirar.

Eu tentei usando umHttpSessionListener, está chamando osessionDestroyed() método de evento, mas não consigo encaminhar / redirecionar a solicitação para lá. Eu acho que é porque não háHttpServletRequest eHttpServletResponse objetos.

Eu também tentei usando umPhaseListener, mas resulta em um erro "muitos redirecionamentos" no navegador da web.

public class SessionListener implements PhaseListener {

    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }

    public void beforePhase(PhaseEvent event) {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            try {
                System.out.println("Session Destroyed");
                FacesContext.getCurrentInstance().getExternalContext().redirect("login.jsf");
            }
            catch (Exception e) {
                System.out.println("error" + e);
            }
        }
    }

    public void afterPhase(PhaseEvent event)  {
        try {
            System.out.println("Session Created");
        }
        catch (Exception e) {
            System.out.println("error" + e);
        }
    }

}

Por que essas tentativas não funcionam e como posso resolvê-las da melhor forma?

questionAnswers(2)

yourAnswerToTheQuestion