2009-07-22 6 views
5

Una volta eseguito correttamente l'accesso al sistema, il sistema reindirizzerà l'utente alla pagina iniziale. Ora il mio problema è che se l'utente fa clic sulla pagina dell'account di visualizzazione senza accedere al sistema, il sistema reindirizzerà l'utente alla pagina di accesso. se l'utente accede al sistema ora il sistema reindirizzerà l'utente alla home page, in questo caso qualsiasi metodo può reindirizzare l'utente alla pagina precedente che è la pagina dell'account di visualizzazione invece della homepage?JSF reindirizzamento alla pagina precedente

Ho provato ad utilizzare sessione

String url = (String)session.getAttribute("url"); 
if(url != null) 
    response.sendRedirect(url); 
else 
    response.sendRedirect("homepage.faces"); 

ho messo questo codice sotto doBtnAction public void() {} Se il login utente con successo quindi reindirizzare l'url. Ma ho ricevuto questo errore

java.lang.IllegalStateException: Cannot forward after response has been committed 
    com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322) 
    com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130) 
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87) 
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200) 
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:198) 

risposta

0

Non hai descritto alcuna infrastruttura che usi per l'autenticazione, quindi presumo che tu esegua l'autenticazione nel proprio codice. Probabilmente, l'approccio più semplice sarebbe quello di salvare la destinazione iniziale in sessione prima di reindirizzare alla pagina di accesso, e quindi dopo il login riuscito è possibile controllare questo attributo e reindirizzare verso il posto giusto. In particolare per JSF è possibile farlo in modalità azione che elabora l'accesso. In realtà, suggerirei di utilizzare qualche framework per l'autenticazione, ad esempio Spring Security, perché fa cose così fuori dalla scatola, e sarà molto più facile estendere il tuo sistema di sicurezza nel caso in cui hai bisogno di alcune funzionalità aggiuntive, anche se necessita alcune configurazioni aggiuntive

+0

Seam consente anche di fare questo, fuori dalla scatola – mtpettyp

+0

sto usando JSF e filtro per verificare se la sessione è nullo se nulla reindirizzare l'utente alla pagina di accesso. –

2

Non sono sicuro, ma prova a fare questo attraverso ExternalContext strutture:

Qualcosa di simile a questo:

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 
externalContext.redirect(externalContext.encodeResourceURL(externalContext.getRequestContextPath()+getUrl())); 
-2

Sei troppo tardi e che si sta dando l'eccezione. Fatelo in un phaselistener prima della fase di risposta al rendering.

+3

Questo non ha senso. – BalusC

15

Questa eccezione è causata dal fatto che hai chiamato response.sendRedirect() e non hai impedito a JSF di restituire la risposta normale. È necessario informare JSF che non è necessario gestire la normale risposta aggiungendo

FacesContext.getCurrentInstance().responseComplete(); 

al metodo di azione.

O, meglio ancora, semplicemente non ottenere il HttpServletResponse da sotto cappe del JSF, ma invece fare:

FacesContext.getCurrentInstance().getExternalContext().redirect(url); 

Questo richiamerà automaticamente responseComplete() e mantiene anche il vostro codice pulito da roba API inutili Servlet . Vedi anche lo ExternalContext API.

+0

Amo lo stackoverflow! Devo ancora avere bisogno di fare una domanda, perché trovo sempre il mio già risposto qui. Grazie BalusC. – Naganalf

+0

Questo non funziona nel mio caso: quando chiamo getAttribute ("url") su HttpSession, ottengo null. Ho provato a chiamare getRequestURI() su HttpServletRequest, ma questo restituisce l'URI della pagina di accesso a cui l'utente viene reindirizzato se non ha effettuato l'accesso. – Theo

+0

@Theo: questo è un problema completamente diverso. Devi prima impostare tu stesso :) – BalusC

0

java.lang.IllegalStateException: Impossibile avanti dopo la risposta è stata impegnata

L'eccezione è abbastanza chiara:

  • La risposta è stata commessa.
  • Non è possibile inoltrare una volta eseguita la risposta.

Cosa non ha senso?

0

La logica descritta (reindirizzamento di accesso) deve essere implementata tramite la meccanica del filtro. Puoi anche provare le regole di navigazione standard di jsf (se può adattarsi al tuo caso). E se vuoi ancora inviare il reindirizzamento a un URL personalizzato e non vuoi utilizzare i filtri, fallo nel servlet in fase di rendering, non nel tuo jsf bean.

-2

Posizionando la sintassi di seguito in web.xml dovrebbe funzionare:

<context-param> 
<param-name>com.sun.faces.writeStateAtFormEnd</param-name> 
<param-value>false</param-value> 
</context-param> 
+0

Questa è la soluzione per un ** diverso ** causa che si verifica in un'eccezione simliar (ma non uguale!). Vedi anche http://stackoverflow.com/questions/8072311/illegalstateexception-cannot-create-a-session-after-the-response-has-been-commi/8072445#8072445 – BalusC

Problemi correlati