2011-12-06 13 views
12

¿Hay un mecanismo incorporado para redirigir condicionalmente a otra vista? Quiero que el usuario sea redireccionado desde la página de inicio de sesión a la "página de inicio" si ya ha iniciado sesión.Redirección condicional en JSF

Ya tengo dos enfoques básicos, pero por primera vez no tengo idea de cómo lograrlo y segundo es una especie de solución sucia.

  1. Añadir <meta http-equiv="Refresh" content="0; URL=home.jsf" /> y que sea rendido condicionalmente (EL: #{login.loggedIn})
  2. Añadir un <h:panelGroup /> que también se representará en forma condicional, que contiene algo de JavaScript hacer la redirección.

¿Hay alguna manera de lograr o incluso otra solución más elegante? :-)

Gracias

Respuesta

18

usted podría utilizar para este <f:event type="preRenderView">.

E.g.

<f:event type="preRenderView" listener="#{login.checkAlreadyLoggedin}" /> 

con

public void checkAlreadyLoggedin() throws IOException { 
    if (isLoggedIn()) { 
     ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 
     ec.redirect(ec.getRequestContextPath() + "/home.xhtml"); 
    } 
} 
+0

perfecto! Funciona como un encanto, gracias. Mientras tanto, descubrí y probé otro enfoque: implementé un filtro que estaba registrado exclusivamente para la página de inicio de sesión, pero falló porque no pude acceder al '' SessionScoped' 'login' bean ni al' User' que maneja . La sesión estaba vacía ...?! – Kai

+0

El filtro solo funcionará para un JSF '@ ManagedBean', no para un CDI' @ Named' bean. – BalusC

+0

¡Ah, vale! Pensé que esto estaría de alguna manera asegurado por el contenedor JEE ... – Kai

0

La solución prevista por @BalusC no funciona en el caso de la vista 'home.xhtml' no es la vista por defecto del portlet JSF. Para aquellos que necesitan redirigir a una vista no predeterminada durante la fase de renderizado, sugiero la solución que se establece en this entry. Es decir, dentro del método preRenderView haga lo siguiente:

FacesContext fc = FacesContext.getCurrentInstance(); 
NavigationHandler navigationHandler = fc.getApplication().getNavigationHandler(); 
navigationHandler.handleNavigation(fc, null, "/views/nonDefaultView.xhtml?faces-redirect=true"); 
fc.renderResponse(); 

Créditos a @Frizz1977