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

Tha*_*han 7 java session jsf login facelets

我已经使用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
        ...
Run Code Online (Sandbox Code Playgroud)

我需要隐藏在数据表中的列,如果用户没有登录.现在我的问题是,我如何才能访问里面我的Facelets页面会话属性?

Bal*_*usC 17

您已将登录用户存储为名为"user"的会话属性.

因此它在EL中可用如下:

#{user}
Run Code Online (Sandbox Code Playgroud)

你可以empty在EL中使用关键字来检查它是否存在(即它是否已登录),你可以使用JSF组件的rendered属性来指示是否生成HTML输出.

<h:panelGroup rendered="#{not empty user}">
    <p>Welcome #{user}, you have been logged in!</p>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)

在您隐藏表列的特定情况下,只需按如下方式使用它:

<p:column rendered="#{not empty user}">
    ...
</p:column>
Run Code Online (Sandbox Code Playgroud)

存储会话属性的更好方法是使用ExternalContext#getSessionMap().这样你的代码就没有臭味的javax.servlet.*进口了.

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("user", username);
Run Code Online (Sandbox Code Playgroud)

具体问题无关,为什么以下检查?

if (username.equals(getUsername_db()) && password.equals(getPassword_db())) {
Run Code Online (Sandbox Code Playgroud)

你为什么不在SELECT ... FROM user WHERE username=? AND password=?SQL中做一个?或者你不相信它返回右行的数据库?

  • 这也没意义.只需在WHERE中添加密码即可.SQL查询应该*始终*以这样的方式写入,即它准确地返回**所需的数据,之后不需要任何必要的额外检查.顺便说一句,在SQL字符串中使用字符串连接用户控制的输入就像你正在打开一个巨大的SQL注入攻击漏洞.使用预备陈述. (2认同)