Проблема рендеринга JSF Facelets - PullRequest
0 голосов
/ 09 августа 2010

У меня проблема с моими лицами:

Я ограничил навигационную часть, которая отображает информацию для входа о текущем пользователе и кнопку выхода из системы. Логин работает правильно. Но после того, как пользователь вышел из системы, на навигационной части моей страницы отображается

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 Drinker, это может быть проблемой с 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";
}

И на ней вы можете увидеть мое авторизованное bean-компонент «авторизация» , который должен предоставить информацию, которая может быть использована для скрытия таких компонентов, как кнопка входа в систему:

@ManagedBean
@RequestScoped
public class Authorisation {

    private Subject currentUser;

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

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

Ответы [ 2 ]

2 голосов
/ 09 августа 2010

Хорошо, насколько я понимаю, ваша проблема в том, что даже после выхода пользователя из системы навигационная часть вашей страницы отображает

Welcome, User (role)    [Logout_Button]

Принимая во внимание, что вы хотите, это то же самое, что происходит при первом входе в систему:

Welcome, Guest

Проблема, я думаю, в функциональности вашего выхода из системы. По любой причине, даже после выхода из системы #{authorisation.authenticated} возвращает true. Во-вторых, #{loginController.principal} по-прежнему содержит значение ранее вошедшего в систему пользователя и его / ее роль. Возможно, какой-либо из этих бобов ограничен сессией или где-то кэширует значение?

И BalusC прав (как обычно) в том смысле, что вы используете слово rendered здесь неправильно. Кнопка - единственный элемент, который условно rendered. Из того, что я вижу, Welcome, User(role), против Welcome, Guest основан исключительно на значении в loginController.

Если вы можете опубликовать часть своего Java-кода для этих компонентов и функции входа / выхода из системы, мы можем попытаться помочь вам

1 голос
/ 10 августа 2010

Благодарю BalusC и Java Drinker за вашу помощь, я обнаружил свою глупую ошибку:

Возможно, какой-либо из этих бобов был ограничен сессией

Это было неправильночасть!Я использовал 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";
}

Я нашел очень симпатичную ссылку о различиях управляемых компонентов и о том, как их следует определять :-) KLICk

Возможноэта тема может вдохновить начинающего Java, как и я; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...