2010-08-09 241 views
0

我對我的facelets有個問題:JSF Facelets渲染問題

我收縮了一個導航部件,顯示關於curren用戶和註銷按鈕的登錄信息。登錄正常工作。但是在用戶註銷後,導航部分我的頁面顯示

Welcome, User (role) [Logout_Button] 

然而,我要的是,當你第一次發生在登錄同樣的事情

Welcome, Guest 

(謝謝你的那些簡單單詞的Java飲酒:-))

在這裏你可以看到我的模板的一部分:

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

這就是我的登錄信息(稱爲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> 

由於BalusC和Java酒徒認爲這可能是一個Java的邏輯問題。我首先需要說的是,我使用Apache Shiro來解決安全問題。因此,這裏是相關的Java代碼:

我的LoginController包含註銷方法:

@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"; 
} 

而她,你可以看到我的支持豆「授權」,這是應該提供的信息可用於隱藏像loginbutton comonents:

@ManagedBean 
@RequestScoped 
public class Authorisation { 

    private Subject currentUser; 

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

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

我不知道我明白。你是說 ...部分在用戶註銷後不顯示? – 2010-08-09 13:10:41

+0

對不起,我真的不知道這個問題。我認爲你正在使用的「渲染」這個詞含糊不清。你不是有條件地渲染代碼示例的login_info div中的任何地方,但是你在問題描述中是這樣說的。我認爲你*實際上*意思是「顯示值」或「返回值」,你說的「渲染」。這反過來不是渲染問題,而是模型/代碼邏輯問題。 – BalusC 2010-08-09 16:44:52

+0

抱歉讓人困惑的話。我的技術術語有時不是正確的。但我會改善! Thx閱讀和幫助 – Sven 2010-08-10 06:46:50

回答

2

好了,從我的理解,你的問題是,用戶註銷後,也將導航你的頁面的一部分顯示

Welcome, User (role) [Logout_Button] 

然而,你想要的是,當你到達登陸第一次發生同樣的事情:

Welcome, Guest 

的問題,我認爲,是你的註銷功能。無論出於何種原因,即使在註銷後,#{authorisation.authenticated}正在返回true.其次,#{loginController.principal}仍包含先前登錄的用戶和他/她的角色的值。這些bean會話中的任何一個可能是作用域還是緩存值?

而且BalusC是正確(像往常一樣)在您正在使用的詞rendered這裏不正確。按鈕是有條件rendered.從我看到的唯一元素,在Welcome, User(role),VS Welcome, Guest僅基於loginController.

值。如果你可以張貼一些Java代碼對那些豆類和登錄/註銷功能我們可以嘗試以幫助進一步

+0

謝謝理解-.-我會編輯整篇文章並添加一些java邏輯:-) – Sven 2010-08-10 06:25:10

1

感謝對BalusC和Java的飲酒對你有所幫助,我發現我的愚蠢的錯誤:

是這些豆子會議的作用域 也許

這是錯誤的部分!我將SessionScoped用於我的控制器而不是RequestScoped。因此,這裏是正確的控制器:

@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"; 
} 

我發現約managedBeans的區別一個非常好的鏈接,應如何:-)作用域KLICk

也許這線程可以給出一些啓示,初學java作爲我也是;-)

+1

太棒了!很高興我們可以提供幫助。 – 2010-08-10 12:18:28