2010-08-09 4 views
0

J'ai un problème avec mes facelets:JSF Facelets problème de rendu

Je constriction une partie nav qui affiche les informations de connexion pour l'utilisateur courant et un bouton de déconnexion. La connexion fonctionne correctement. Mais après un utilisateur se déconnecte, la nav partie de ma page affiche

Welcome, User (role) [Logout_Button] 

Alors, ce que je veux est la même chose qui se produit lorsque vous arrivez à la connexion la première fois:

Welcome, Guest 

(Merci Java abreuvoir pour ces mots faciles :-))

ici vous pouvez voir une partie de mon modèle:

<div id="metaContainer"> 
     <ui:include src="/metaMenu.xhtml" /> 
    </div> 

C'est ma part de nav avec login informations (appelé metaMenu.xhtml):

<ui:composition xmlns="http://www.w3.org/1999/xhtml" lang="en" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core"> 
    <div id="login_info"> 
     <h:outputLabel value="Willkommen, "/> 
     <h:outputLabel class="principal" value="#{metaNavData.principal}"/> 
     <h:outputLabel value="#{metaNavData.role}"/> 
    </div> 
    <div id="meta_nav"> 
     <h:form name="loginform" rendered="#{authorisation.authenticated}"> 
     <h:commandLink action="#{loginController.logout}" rendered="#{authorisation.authenticated}"> 
     Logout</h:commandLink> 
     </h:form> 
    </div> 
</ui:composition> 

Comme BalusC et Java Buveur supposé qu'il pourrait être un problème de logique java. Je dois d'abord dire, que j'utilise Apache Shiro pour des problèmes de sécurité. Donc, voici le code Java correspondant:

mon loginController qui contient la méthode logout:

@ManagedBean 
@SessionScoped //Mistake!!! That should be RequestScoped, see below 
public class LoginController { 

private Subject currentUser; // import org.apache.shiro.subject.*; 

public LoginController() { 
    currentUser = SecurityUtils.getSubject(); 
} 

public String logout() { 
    if (currentUser.isAuthenticated()) { 
    currentUser.logout(); 
    } 
    return "welcome.xhtml"; 
} 

Et elle vous pouvez voir mon grain soutenu par « autorisation », qui est censé fournir des informations peut être utilisé pour cacher comonents comme le loginbutton:

@ManagedBean 
@RequestScoped 
public class Authorisation { 

    private Subject currentUser; 

    public Authorisation(){ 
     currentUser = SecurityUtils.getSubject(); 
    } 

    public boolean getAuthenticated(){ 
     return currentUser.isAuthenticated(); 
    } 
+1

Je ne suis pas sûr de comprendre. Voulez-vous dire que la partie ... ne s'affiche pas une fois que l'utilisateur est déconnecté? –

+0

Désolé, je n'ai vraiment pas le problème. Je pense qu'il y a une ambiguïté dans le mot «render» que vous utilisez. Vous ne pouvez pas effectuer de rendu conditionnel dans la div de login_info de l'exemple de code, mais vous le dites dans la description du problème. Je pense que vous * signifiiez en fait "valeur affichée" ou "valeur renvoyée" lorsque vous avez dit "rendu". Ce n'est pas un problème de rendu, mais un problème de modèle/code-logique. – BalusC

+0

désolé pour les mots confus. mes termes techniques ne sont parfois pas les bons. mais je vais m'améliorer! Merci de lire et de votre aide – Sven

Répondre

2

Ok, donc ce que je comprends, votre problème est que, même après qu'un utilisateur se déconnecte, la nav partie de votre page affiche

Welcome, User (role) [Logout_Button] 

Alors, ce que vous voulez est la même chose qui se produit lorsque vous arrivez à la connexion la première fois:

Welcome, Guest 

Le problème, je pense, est dans votre déconnecter la fonctionnalité. Pour une raison quelconque, même après la déconnexion, #{authorisation.authenticated} renvoie true. Deuxièmement, #{loginController.principal} contient toujours la valeur de l'utilisateur précédemment connecté et son rôle. Est-ce que l'un de ces beans session est peut-être étendu, ou cache-t-il la valeur quelque part? BalusC a raison (comme d'habitude) en ce que vous utilisez le mot rendered ici incorrectement.Le bouton est le seul élément qui est conditionnellement rendered. D'après ce que je vois, le Welcome, User(role), vs Welcome, Guest est basée uniquement sur la valeur de la loginController.

Si vous pouvez poster une partie de votre code Java pour les haricots et connexion/fonctionnalité de fermeture de session , nous pouvons essayer d'aider davantage

+0

Merci de votre compréhension -.- Je vais modifier tout le post et ajouter une logique java :-) – Sven

1

Remerciez de Java à BalusC et Buveur pour votre aide, j'ai trouvé mon erreur stupide:

Est-ce que de ces séances de haricots SCOPED peut-être

C'était la mauvaise partie! J'ai utilisé SessionScoped pour mon contrôleur au lieu de RequestScoped. Voici donc le contrôleur droit:

@ManagedBean 
@RequestScoped // Here was my mistake 
public class LoginController { 

private Subject currentUser; // import org.apache.shiro.subject.*; 

public LoginController() { 
    currentUser = SecurityUtils.getSubject(); 
} 

public String logout() { 
    if (currentUser.isAuthenticated()) { 
    currentUser.logout(); 
    } 
    return "welcome.xhtml"; 
} 

J'ai trouvé un lien très agréable sur les distinctions de managedBeans et comment ils devraient être scope :-) KLICk

Peut-être ce fil peut donner un peu d'inspiration pour Java débutant comme Je suis aussi ;-)

+1

C'est génial! Content que nous puissions aider. –