如何在Facelets页面中访问会话属性

9
我使用JSF和PrimeFaces实现了一个登录表单。我使用了PrimeFaces展示网站上的这个例子
我有一个Facelets页面来显示dataTable。现在我需要将上述登录表单与此表格页面集成。因此,我在LoginBean.java中添加了几行代码来处理会话属性。
     if (username.equals(getUsername_db()) && password.equals(getPassword_db())) {//valid user and paward
        loggedIn = true;
        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Welcome", getUsername_db());
        //new lines
        FacesContext context2 = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context2.getExternalContext().getSession(true);
        session.setAttribute("user", username);
        //end of new lines
        ...

如果用户未登录,则需要从dataTable中隐藏某一列。我的问题是如何在Facelets页面内访问会话属性?

1个回答

21

你已将登录用户存储为会话属性,名称为"user"。

因此,它可以在EL中按以下方式使用:

#{user}
你可以在EL中使用empty关键字来检查它是否存在(即是否已登录),并且你可以使用JSF组件的rendered属性来指示是否生成HTML输出。
<h:panelGroup rendered="#{not empty user}">
    <p>Welcome #{user}, you have been logged in!</p>
</h:panelGroup>

对于您隐藏表格列的情况,只需按以下方式使用即可:

<p:column rendered="#{not empty user}">
    ...
</p:column>

使用ExternalContext#getSessionMap()来存储会话属性是一种更好的方式。这样你的代码就不会有难闻的javax.servlet.*导入。

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("user", username);

与具体问题无关,为什么要进行以下检查?


if (username.equals(getUsername_db()) && password.equals(getPassword_db())) {

为什么不在SQL中执行SELECT ... FROM user WHERE username=? AND password=?呢?或者您不相信数据库返回正确的行吗?


谢谢BalusC,但我在视图中得到了用户对象。类似于这样显示“User@1a8b71e”的东西。无论如何,我从您的答案中获得了<h:panelGroup rendered ="#{not empty user}">部分来解决我的问题。我删除了会话设置部分,并将LoginBean类设置为SessionScoped。然后我能够直接在我的panelGroup标记内获取值。再次感谢SQL建议。我使用预准备语句进行了更改。 - Tharaka Deshan
显然,你代码中所显示的 username 根本不是一个 String。也许你在问题中过于简化了代码?顺便说一下,SQL 注释并不是暗示要使用预编译语句的。你在比较用户名和密码时进行了两次比较(一次在数据库中,另一次在 Java 中)。这毫无意义。只需检查 DB 是否返回了一条记录即可。你不需要再次比较已经要求 DB 检查和返回的用户名/密码。 - BalusC
明白了!但在我的最后一个SQL查询中,我只使用了“username”作为WHERE子句的条件。例如:String query = "SELECT username,password FROM user WHERE username = '" + uname + "'; "; 因此,我可以删除“username.equals(getUsername_db()”这部分。在这种情况下,我只需要检查密码...感谢您的建议。 - Tharaka Deshan
2
这也毫无意义。只需将密码添加到WHERE中即可。SQL查询应始终以这种方式编写,以便返回确切所需的数据,而无需进行任何必要的附加检查。顺便说一句,在SQL字符串中使用字符串连接的用户控制输入,您正在打开一个巨大的SQL注入攻击漏洞。请使用准备好的语句。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接