JSF PrimeFaces会丢失数据和会话

时间:2012-01-12 11:15:12

标签: session jsf primefaces data-loss

我正在使用JSF和PrimeFaces开发一个应用程序。 我有一个托管的,会话作用域,有用户名,密码和isUserLoggedIn。 当我处理登录组件时,它可以工作并相应地更改我的页面。一旦我移动到另一个页面,我就丢失了用户名数据的数据。我需要在整个应用程序中访问用户名。 有谁知道为什么我丢失应该eb会话范围的数据?为什么我要从一页而不是其他页面保留它? 感谢

import authentication.AuthenticatorManagerLocal;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@SessionScoped
public class UserMB {
    @EJB
    private AuthenticatorManagerLocal authenticatorManager;

    /** Creates a new instance of UserMB */
    public UserMB() {
    }

    Boolean isUserLoggedIn;
    String username;
    String password;
    String nickName;

    public String getNickName() {
        nickName="vanessa";
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public Boolean getIsUserLoggedIn() {
        return isUserLoggedIn;
    }

    public void setIsUserLoggedIn(Boolean isUserLoggedIn) {
        this.isUserLoggedIn = isUserLoggedIn;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String authenticateUser(){
       isUserLoggedIn= authenticatorManager.authenticateUser(username, password);
       if(isUserLoggedIn)return "Home";
       else
           return null;
    }

    public void logout(){
        isUserLoggedIn=false;
        username="";
        password="";
    }

    public String goToIndex(){
        return "Index";
    }

}

HOME已

<p:commandButton value="SearchCB" action="#{expSearchResultsMB.search()}" ajax="false" />  

在自定义组件

expSearchResultsMB.search()发送到SearchResults 我想在哪里显示用户名

 <h:outputLabel value="#{userMB.username}" /> 

我需要在应用程序的每个页面中访问用户名和isUSerLoggedin。 当我检查用户是否已登录时,如果他是,则启动Home。 Home正确显示用户名,但在家中我使用searchCB登陆SearchResults页面时不会显示用户名。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:4)

import javax.enterprise.context.SessionScoped;

您为会话范围导入了错误的注释。如果您使用的是JSF @ManagedBean,那么您需要从javax.faces.bean包导入范围。以上仅适用于CDI @Named

所以,相应地修复它:

import javax.faces.bean.SessionScoped;

没有正确范围的@ManagedBean将表现为@NoneScoped。即将在每次EL评估中创建一个新实例,这正是您所看到的问题行为。