3

我正在使用 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。主页正确显示用户名,但是当我在家使用 searchCB 时,登陆 SearchResults 页面不显示用户名。

任何人都可以帮忙吗?

4

1 回答 1

4
import javax.enterprise.context.SessionScoped;

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

所以,相应地修复它:

import javax.faces.bean.SessionScoped;

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

于 2012-01-12T12:26:02.567 回答