当前位置: 首页 > 知识库问答 >
问题:

使用有状态会话范围bean在JSF应用程序中存储用户登录信息

公孙国兴
2023-03-14

美好的一天

这个问题已经在创建MCVE时得到解决(感谢Kukeltje让我这样做:))

请参阅下面发布的答案,了解有效的MCVE。

@SessionScoped
@Stateful
public class StoringUserInfo implements Serializable {

    private HashMap<String, String> userSettingMap;
    private String userName = "Test";

    public StoringUserInfo() {
        this.userSettingMap = new HashMap<>();
    }

    public void addSetting(String name, String setting) {
        userSettingMap.put(name, setting);
    }

    public String getSetting(String name) {
        return userSettingMap.get(name);
    }

    public HashMap<String, String> getUserSettingMap() {
        return userSettingMap;
    }

    public void setUserSettingMap(HashMap<String, String> userSettingMap) {
        this.userSettingMap = userSettingMap;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String projectName) {
        this.projectName = userName;
    }
}

例如,在一个名为@ViewScoped@的bean中,我想这样做:

@Named
@ViewScoped
public class NewProjectView implements Serializable {

    private static final long serialVersionUID = 1L;
    private String userName;
    @Inject private transient StoringUserInfo userInfo;

    public void submitForm(){
        userInfo.setUserName("NEW")
        // return to dashboard
        FacesContext.getCurrentInstance().getViewRoot().getViewMap().clear();
        PrimeFaces.current().ajax().update(":content", ":formHeader:mainMenu", ":formHeader:growl");
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

}

然后,在另一个@ViewScoped@命名bean上,我希望检索存储的值(由于@PostConstruct获取空值,尝试抑制应用程序部署上的错误)

@Named
@ViewScoped
public class EditProjectView implements Serializable {

    private static final long serialVersionUID = 1L;
    private String userName;
    @Inject private transient StoringUserInfo userInfo;


    @PostConstruct
    public void init() {
        getValues()
    }

    private void getValues(){
    try {
        userName = userInfo.getUserName(); // this must display on form load
    } catch (Exception e) {
        e.printStackTrace();
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

}

应用内的工作流确保设置值的页面在需要这些值的页面之前被访问。正确调试也显示了这一点。

但是,@ViewScoped@命名bean始终显示null,它们从不从@SesionScoped bean重新读取值?我错过了什么?

在@SessionScoped@Stateful bean中将默认值设置为用户名字符串,则在第二个表单上显示名称“Test”。

但是,在表单呈现/加载时,不会读取更新后的值。因此,@PostConstruct似乎只在应用程序部署时执行?

我还将此添加到我的xhtml文件中:

<o:form id="editProjectForm">
        <f:metadata>
            <f:viewAction action="#{editProjectView.getProjectValues}"/>
            <p:ajax update="editProjectFieldSet"/>
        </f:metadata>
        <p:fieldset id="editProjectFieldSet" legend="#{editProjectView.userName}"/>

但它仍然不会在呈现之前重新查询SessionScoped bean。它只显示“Test”的默认初始值

共有3个答案

申辉
2023-03-14

试试这个:

HttpSession session = request.getSession();

因此,您可以请求一个具有名称的参数:

String email = (String) session.getAttribute("emailsession");
封瑞
2023-03-14

如果您使用的是CDI,请确保导入javax。企业上下文sessionscoped而不是javax。面孔。豆已处理会话

蒋华美
2023-03-14

两个版本之间的主要区别是:

 1. Replaced <o:form> with <h:form> 

应用程序正在使用PrimeFaces 6.2在WildFly 14上运行。9和OmniFaces 3.2

 类似资料:
  • 我正在使用Glassfish服务器(一个简单的购物车)尝试我的第一个EJB。我打算为每个Http会话使用CartBean。如果我的车豆跟着-

  • 问题内容: 有状态会话Bean定义如下: 有状态会话Bean对象的状态由其实例变量的值组成。在有状态会话Bean中,实例变量代表唯一的客户端Bean会话的状态。因为客户端与其bean进行交互(“交谈”),所以这种状态通常称为对话状态。 无状态会话Bean定义如下: 无状态会话Bean无状态会话Bean不会与客户端保持对话状态。当客户端调用无状态Bean的方法时,该Bean的实例变量可能包含特定于该

  • 我正在用雅加达EE和雅加达Faces(JSF)进行实验。我刚刚制作了一个名为session-scoped bean的CDI(因为JSF managedBean现在已被弃用),我想知道,当作用域bean(在CDI容器中运行)可用时,为什么要使用有状态EJB,在我看来,任何事务都可以使用注入到CDI管理bean中的无状态bean来完成。 :),任何现实世界的用例都会非常有用。 对于那些想知道的人,我的

  • 我编写了一个会话范围的托管bean,用于在domino xpages应用程序中缓存sesion用户特定的信息,如下代码所示: 然后,我在faces配置中声明了它,使其成为会话范围的bean: 在测试bean时,我通过#{NBUser.fullUserName}使用它,它并不总是返回当前domino http会话上下文的用户,例如,我首先由用户“user1”登录并注销,然后由user2登录,bean

  • 对于有状态会话bean(SFSB)和无状态会话bean(SLSB)的用法,我有点困惑。 我知道SFSB与客户保持状态。这很有帮助:什么时候使用有状态会话bean而不是无状态会话bean? 这里和许多其他地方提供的示例是SFSB的购物车。 “如果一个任务需要一系列方法调用(不止一次),并且您需要保留以前的结果以在下一次调用中使用它们,那么就可以使用SFSB”--Source。这将更像是签出(页面之间

  • 我的密码\u散列有问题,当我登录时,我想让用户登录会话,但当我使用密码验证时不工作,回显不返回任何内容。我怎样才能解决这个问题?谢谢这是我的代码: 这个代码完美的工作时,我不使用password_verify。