¿Cómo redireccionar a la página de inicio de sesión cuando la sesión expira?

Tengo tres módulos web JSF 2.0 y debo redirigir a la página de inicio de sesión cuando caduque la sesión.

Lo he intentado usando unHttpSessionListener, esta llamando a lasessionDestroyed() método de evento, pero no puedo reenviar / redirigir la solicitud allí. Creo que es porque no hayHttpServletRequest yHttpServletResponse objetos.

También lo probé usando unPhaseListener, pero da como resultado un error de "demasiados redireccionamientos" en el navegador 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 qué esos intentos no funcionan y cómo puedo resolverlo mejor?

Respuestas a la pregunta(2)

Su respuesta a la pregunta