2010-11-05 3 views
1

Mon application JSF redirige tout utilisateur qui n'est pas connecté à la page de connexion. Lorsque l'utilisateur se connecte, je souhaite que l'application redirige vers la page que l'utilisateur a initialement saisie dans la barre d'adresse du navigateur. Mais je ne sais pas comment accéder à l'url que l'utilisateur a initialement saisi, car il est automatiquement redirigé vers la page de connexion que j'ai configurée dans le fichier web.xml.JSF 2.0: Comment obtenir l'URL qui est entrée dans la barre d'adresse du navigateur

+0

Donc, vous utilisez la sécurité gérée par conteneur, comme dans 'j_security_check'? – BalusC

+0

Oui, j'utilise la sécurité gérée par conteneur. Mais lorsque je me connecte, j'utilise HttpServletRequest.login (nom d'utilisateur, mot de passe) au lieu de j_security_check. – Theo

+1

Astuce, utilisez '@ nickname' comme' @ BalusC' pour informer les autres des commentaires sur les messages qui ne sont pas d'eux-mêmes. Sinon, vous dépendez de savoir si l'un regardera plus tard dans le sujet ou non (souvent pas). Voir aussi http://meta.stackexchange.com/questions/43019/how-do-comment-replies-work – BalusC

Répondre

5

La sécurité gérée par conteneur ne dispose pas d'installations fournies par l'API pour cela. Votre meilleur pari est de remplacer le <login-config> par une classe Filter qui fait à peu près comme ceci:

HttpServletRequest httpreq = (HttpServletRequest) request; 
HttpServletResponse httpres = (HttpServletResponse) response; 
if (httpreq.getUserPrincipal() == null) { 
    httpreq.getSession().setAttribute("from", httpreq.getRequestURI()); 
    httpres.sendRedirect("login.jsf"); 
} else { 
    chain.doFilter(request, response); 
} 

Et puis dans votre truc de connexion:

request.login(username, password); 
externalContext.redirect((String) request.getSession().getAttribute("from")); 
+0

Je viens de creuser cette réponse, en pensant au filtre pour [cette question] (http://stackoverflow.com/questions/4413407/). Bonne réponse, bien sûr. Il craint vraiment qu'il n'y ait pas d'API pour cela - cela semble être un cas d'utilisation assez commun. Je suis curieux: si vous supprimez '' de 'web.xml', est-ce que' request.login (nom d'utilisateur, mot de passe); 'fonctionne toujours? Comment? –

+0

@Matt: Oui, ça va marcher. C'est juste le nouveau remplacement programmatique de Servlet 3.0 qui fait la même chose que '' (en combinaison avec le '' du filtre). Vous devez cependant garder l'entrée '' et les utilisateurs/mots de passe/rôles dans un domaine. – BalusC

+0

Comment configurer login-config dans le descripteur de déploiement pour que cela fonctionne correctement? Si je supprime l'authentification de formulaire, le navigateur Web définit request.userPrincipal sur une valeur mise en cache, donc (httpreq.getUserPrincipal() == null) sera faux. Si j'active l'authentification de formulaire, le filtre n'est pas exécuté du tout puisque le conteneur prend le relais. –

Questions connexes