2011-12-06 21 views
12

esiste un meccanismo incorporato per il reindirizzamento condizionale a un'altra vista? Voglio che l'utente venga reindirizzato dalla pagina di accesso alla "home page" se ha già effettuato il login.Reindirizzamento condizionale in JSF

Ho già due approcci di base, ma per il primo non ho idea di come raggiungere e il il secondo è una sorta di soluzione sporca.

  1. Aggiungere <meta http-equiv="Refresh" content="0; URL=home.jsf" /> e lascia che sia reso condizionale (EL: #{login.loggedIn})
  2. Aggiungi un <h:panelGroup /> che sarà anche reso condizionale, contenente alcune JavaScript fare il redirect.

C'è un modo per ottenere o anche un'altra soluzione più elegante? :-)

Grazie

risposta

18

si potrebbe usare <f:event type="preRenderView"> per questo.

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

Perfetto! Funziona come un vero amore, grazie. Nel frattempo ho scoperto e provato un altro approccio: ho implementato un filtro che è stato registrato esclusivamente per la pagina di accesso, ma non è riuscito poiché non sono riuscito ad accedere al bean di login '@ SessionScoped' nè all'Utente' che gestisce . La sessione era vuota ...?! – Kai

+0

Il filtro funzionerà solo per un JSF '@ ManagedBean', non per un bean CDI' @ Named'. – BalusC

+0

Ah, Ok! Ho pensato che questo sarebbe stato in qualche modo assicurato dal container JEE ... – Kai

0

La soluzione prevista dal @BalusC non funziona nel caso la vista 'home.xhtml' non è la vista predefinita del portlet JSF. Per coloro che hanno bisogno di reindirizzare a una vista non predefinita durante la fase di rendering, suggerisco la soluzione descritta entro this entry. Cioè, all'interno del metodo preRenderView effettuare le seguenti operazioni:

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

Crediti per @Frizz1977