2009-07-22 6 views
5

Une fois que l'utilisateur s'est connecté avec succès au système, le système redirigera l'utilisateur vers la page d'accueil. Maintenant, mon problème est le suivant: si l'utilisateur clique sur la page de visualisation du compte sans se connecter au système, le système redirigera l'utilisateur vers la page de connexion. Si l'utilisateur se connecte au système maintenant le système redirigera l'utilisateur vers la page d'accueil, dans ce cas, n'importe quelle méthode peut rediriger l'utilisateur vers la page précédente qui affiche la page du compte au lieu de la page d'accueil?Navigation JSF rediriger vers la page précédente

i essayé d'utiliser la session

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

je mets ce code sous doBtnAction public void() {} si la connexion de l'utilisateur avec succès puis rediriger vers l'URL. Mais j'ai eu cette erreur

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) 

Répondre

0

Vous n'avez décrit aucune infrastructure de cadre que vous utilisez pour l'authentification, donc je suppose que vous effectuez l'authentification dans votre propre code. Probablement, l'approche la plus simple serait de sauvegarder la destination initiale en session avant de la rediriger vers la page de connexion, et après une connexion réussie, vous pouvez vérifier cet attribut et rediriger vers le bon endroit. Je particulier pour JSF vous pouvez le faire dans la méthode d'action qui traite la connexion. En fait, je suggère d'utiliser un framework pour l'authentification, par exemple Spring Security, car il fait des choses hors de la boîte, et il sera beaucoup plus facile d'étendre votre système de sécurité au cas où vous auriez besoin de fonctionnalités supplémentaires. une configuration supplémentaire

+0

Seam vous permet également de le faire hors de la boîte – mtpettyp

+0

J'utilise JSF et FIlter pour vérifier si la session est null si null rediriger l'utilisateur vers la page de connexion. –

2

Je ne sais pas, mais essayez de le faire à travers ExternalContext installations:

Quelque chose comme ceci:

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

vous êtes trop tard et qui vous donne l'exception. Faites-le dans un phaselistener avant la phase de réponse de rendu.

+3

Cela n'a aucun sens. – BalusC

15

Cette exception est due au fait que vous avez appelé response.sendRedirect() et que vous n'avez pas bloqué JSF de la réponse normale. Vous devez informer JSF qu'il n'a pas besoin de gérer la réponse normale en ajoutant

FacesContext.getCurrentInstance().responseComplete(); 

à la méthode d'action.

Ou, mieux encore, il suffit de ne pas obtenir le HttpServletResponse sous les capots de JSF, mais plutôt faire:

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

Cela invoquera automatiquement responseComplete() et il maintient également votre code propre de choses API Servlet inutiles . Voir aussi le ExternalContext API.

+0

J'aime stackoverflow! Je n'ai pas encore besoin de poser une question, parce que je trouve toujours le mien déjà répondu ici. Merci BalusC. – Naganalf

+0

Cela ne fonctionne pas dans mon cas: lorsque j'appelle getAttribute ("url") sur HttpSession, j'obtiens null. J'ai essayé d'appeler getRequestURI() sur le HttpServletRequest, mais cela retourne l'URI de la page de connexion à laquelle l'utilisateur est redirigé s'il n'est pas connecté. – Theo

+0

@Theo: c'est un problème totalement différent. Vous devez le définir vous-même en premier :) – BalusC

0

java.lang.IllegalStateException: ne peut pas transmettre après la réponse a été commise

L'exception est assez claire:

  • La réponse a été commise.
  • Vous ne pouvez pas transférer après que la réponse a été validée.

Qu'est-ce qui n'a pas de sens?

0

La logique décrite (login-redirect) doit être implémentée via la mécanique du filtre. Vous pouvez également essayer les règles de navigation standard de jsf (si cela peut vous convenir). Et si vous voulez toujours envoyer une redirection vers une URL personnalisée et que vous ne voulez pas utiliser de filtres, faites-le dans votre servlet en phase de rendu, pas dans votre bean jsf.

-2

Placer la syntaxe ci-dessous dans web.xml devrait fonctionner:

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

Ceci est la solution pour une cause ** différente ** qui se traduit par une exception simliar (mais pas la même!). Voir aussi http://stackoverflow.com/questions/8072311/illegalstateexception-cannot-create-a-session-after-the-response-has-been-commi/8072445#8072445 – BalusC

Questions connexes