【问题标题】:JSF EL Expressions and Java beansJSF EL 表达式和 Java bean
【发布时间】:2017-07-18 03:13:33
【问题描述】:

我有一个 JSF 项目,我正在尝试创建一个登录页面,我已经设法从数据库中获取用户名和密码并验证它们,我的项目有一个 Java bean、托管 bean 和 DAO 类,当用户成功登录,我想打印 Hello Mr.
< h:outputLabel value="#{mBLogin.user.firstName}" /> Hello Mr. 正在打印但名字不是,虽然在测试我的 DAO 类时,我将名字打印到控制台没有任何问题!有人可以建议我做错了什么吗?

我的托管 bean 类:

    @ManagedBean
    @SessionScoped
    public class MBLogin {

        User user = new User();
        LoginDAO loginDao = new LoginDAO();

        public String validteStudent() {
            boolean valid = loginDao.validateStudent(user.getUserId(), user.getPassword());
            if (valid) {
                user.getFirstName();
                HttpSession session = SessionUtils.getSession();
                session.setAttribute("username", user);
                return "admin";
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,
                        "Incorrect Username and Passowrd", "Please enter correct username and Password"));
                return "login";
            }
        }

        public void setUser(User user) {
            this.user = user;
        }

        public User getUser() {
            return user;
        }
    }

我的 Java Bean 类:

    @Table(name = "students_info")
    public class User {

        @Column(name = "std_record_id")
        private int id;

        @Column(name = "std_id")
        private String userId;

        @Column(name = "first_name")
        private String firstName;

        @Column(name = "last_name")
        private String lastName;

        @Column(name = "web_password")
        private String password;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getFirstName() {
            return firstName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        public String getUserId() {
            return userId;
        }

        public void setUserId(String userId) {
            this.userId = userId;
        }

        public String getPassword() {
            return password;
        }

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

    }

我的 DAO 课程:

    public class LoginDAO {

        static JKPlainDataAccess dataAccess = JKDataSourceFactory.getPlainDataAccess();
        User user;

        public boolean validateStudent(String userName, String password) {

            user = dataAccess.executeQueryAsSingleObject(User.class, "id,userId,firstName,lastName,password",
                    "SELECT std_record_id, std_id, first_name, family_name, web_password From  students_info WHERE std_id=? and web_password=?",
                    userName, password);
            JK.print("getAllEmployeeRecords() : ", user);
            if(user != null) {
                System.out.println(user.getFirstName());
                System.out.println(user.getLastName());
                return true;
            }
            return false;
        }

        public static void main(String[] args) {
            LoginDAO a = new LoginDAO();
            a.validateStudent("200663042001", "1234");
        }

    }

我的登录页面后的xhtml页面:

<ui:composition template="/WEB-INF/layouts/default.xhtml">
     <ui:define name="content">
     WELCOME Mr. <h:outputLabel value="#{mBLogin.user.firstName}" />
    AND <h:outputLabel value="#{mBLogin.user.lastName}" />
    </ui:define>
 </ui:composition>

【问题讨论】:

  • Sidenode:不要以纯文本形式存储密码,您至少应该对它们进行哈希处理。否则,数据库泄漏将暴露每个用户的密码,这可能是他的“I-have-this-password-everywhere”-password。
  • @dognose 谢谢你的建议你能推荐一个好的教程吗?
  • 这是一个不错的选择:howtodoinjava.com/security/…

标签: jsf javabeans managed-bean


【解决方案1】:

验证时,您似乎将用户作为会话属性而不将其分配给托管 Bean 字段:

session.setAttribute("username", user);

所以要么将它也分配给实例用户变量,要么简单地使用:

<ui:composition template="/WEB-INF/layouts/default.xhtml">
     <ui:define name="content">
     WELCOME Mr. <h:outputLabel value="#{username.firstName}" />
    AND <h:outputLabel value="#{username.lastName}" />
    </ui:define>
 </ui:composition>

更新

我建议将您的服务方法更改为:

public User validateStudent(..)

您实际返回查询用户的位置,而不是在 DAO 中设置它..

因此您可以将 ManagedBean 方法更改为:

public String validteStudent() {
     User validatedUser = loginDao.validateStudent(user.getUserId(), user.getPassword());
     if (validatedUser != null) {
           this.user = validatedUser;
           HttpSession session = SessionUtils.getSession();
           session.setAttribute("username", user);
      ....

【讨论】:

  • 我已经尝试了这两个建议,但都没有奏效:(
  • 你能解释一下关于将它分配给实例变量的更多信息吗?我做了以下事情: session.setAttribute("firstname", user);
  • 太棒了!很高兴我能帮上忙
猜你喜欢
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 2014-06-21
  • 2017-04-24
  • 2013-09-02
相关资源
最近更新 更多