Java 使用Hibernate,如何检查试图登录的用户在数据库中是否有注册帐户?

Java 使用Hibernate,如何检查试图登录的用户在数据库中是否有注册帐户?,java,hibernate,servlets,login,dao,Java,Hibernate,Servlets,Login,Dao,我不熟悉Hibernate和Servlets,我正在做一个非常小的项目,用户可以在酒店预订房间 我能够成功注册/创建帐户,但无法登录 我曾尝试在DAO类中使用Criteria查询,但由于java.lang.ClassCastException而失败 jsp页面中的用户名和密码被发送到登录servlet,在那里创建一个新的DAO对象,并将提取的用户名和密码传递给它的方法 DAO使用条件查询检查用户是否存在于数据库中并返回布尔值,登录servlet检查返回的布尔值并重定向是否为真 登录Servlet

我不熟悉Hibernate和Servlets,我正在做一个非常小的项目,用户可以在酒店预订房间

我能够成功注册/创建帐户,但无法登录

我曾尝试在DAO类中使用Criteria查询,但由于java.lang.ClassCastException而失败

jsp页面中的用户名和密码被发送到登录servlet,在那里创建一个新的DAO对象,并将提取的用户名和密码传递给它的方法

DAO使用条件查询检查用户是否存在于数据库中并返回布尔值,登录servlet检查返回的布尔值并重定向是否为真

登录Servlet:

DAO类:

public boolean checkUserLogin(字符串uname,字符串pass)
{
布尔登录=false;
试一试{
Configuration cfg=new Configuration().configure().addAnnotatedClass(User.class);
SessionFactory sf=cfg.buildSessionFactory();
Session Session=sf.openSession();
事务tr=session.beginTransaction();
CriteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=builder.createQuery(字符串[].class);
Root=criteriaquery.from(User.class);
Path usernamePath=root.get(“用户名”);
Path passwordPath=root.get(“密码”);
multiselect(usernamePath,passwordPath);
Query Query=session.createQuery(criteriaquery);
List=query.List();
对于(字符串[]s:list)
{
如果(s[0].equals(uname)和&s[1].equals(pass))
{
login=true;
}
其他的
{
登录=假;
}
}
tr.commit();
}捕获(休眠异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回登录;
}

当我尝试登录时,web浏览器重定向到登录servlet,并以java.lang.ClassCastException停止。大多数在线教程都使用jdbc而不是Hibernate。有没有一种简单的方法来实现Hibernate登录?

我已经研究了这个问题,它似乎没有从
query.list()
返回
String[]
中的数据,尽管根据API文档它应该这样做

备选方案

您也可以使用
元组
类或
对象[]

  • 下面的代码使用的是
    元组

  • 另一个重要的一点是,用户名应该是唯一的,用于登录目的。因此,您不需要使用
    query.list()
    而是
    query.getSingleResult()
    可以使用

  • 您还需要添加where条件,以便从数据库中仅检索特定于该用户的用户记录以及您传递给该方法的pass。如果没有where方法,您将获得所有用户列表,然后通过循环找到所需的用户。这不是一个好办法

    public boolean checkUserLogin(String uname, String pass) {
    
        boolean login = false;
    
        try {
    
    
            Configuration cfg = new 
                Configuration().configure().addAnnotatedClass(User.class);
    
            SessionFactory sf = cfg.buildSessionFactory();
    
            Session session = sf.openSession();
    
            Transaction tr = session.beginTransaction();
    
    
            CriteriaBuilder builder = session.getCriteriaBuilder();
    
            CriteriaQuery<Tuple> criteriaquery = builder.createQuery(Tuple.class);
            Root<User> root = criteriaquery.from(User.class);
    
            Path<String> usernamePath = root.get("username");
            Path<String> passwordPath = root.get("password");
    
            criteriaquery.multiselect(usernamePath, passwordPath);
    
            criteriaquery.where(builder.equal(root.get("username"), uname), builder.equal(root.get("password"), pass));
    
            Query<Tuple> query = session.createQuery(criteriaquery);
    
            Tuple _userRec = query.getSingleResult();
            System.out.println("user -> " + _userRec.get(0, String.class) + ", pass -> " + _userRec.get(1, String.class));
    
            if (_userRec != null) {
                login = true;
            }
    
            tr.commit();
    
        } catch (HibernateException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        return login;
    }
    
    public boolean checkUserLogin(字符串uname,字符串pass){
    布尔登录=false;
    试一试{
    配置cfg=新
    Configuration().configure().addAnnotatedClass(User.class);
    SessionFactory sf=cfg.buildSessionFactory();
    Session Session=sf.openSession();
    事务tr=session.beginTransaction();
    CriteriaBuilder=session.getCriteriaBuilder();
    CriteriaQuery CriteriaQuery=builder.createQuery(Tuple.class);
    Root=criteriaquery.from(User.class);
    Path usernamePath=root.get(“用户名”);
    Path passwordPath=root.get(“密码”);
    multiselect(usernamePath,passwordPath);
    其中(builder.equal(root.get(“用户名”),uname),builder.equal(root.get(“密码”),pass));
    Query Query=session.createQuery(criteriaquery);
    Tuple _userRec=query.getSingleResult();
    System.out.println(“user->”+_userRec.get(0,String.class)+”,pass->“+_userRec.get(1,String.class));
    如果(_userRec!=null){
    login=true;
    }
    tr.commit();
    }捕获(休眠异常e){
    e、 printStackTrace();
    }捕获(例外e){
    e、 printStackTrace();
    }
    返回登录;
    }
    

  • 不要抓住冬眠的例外。捕获它只会在代码中隐藏一个bug。如果您的问题是关于异常的,那么发布它的准确和完整的堆栈跟踪。它包含我们需要知道的内容,以便理解抛出的原因和位置。请注意,每次收到请求时都构建一个新的会话工厂并不是您应该做的事情。这需要大量的时间和资源。这件事必须做一次,而且只能做一次。我真的建议您阅读Hibernate用户指南。尽管您的查询是完全静态的,但使用条件查询也是过分的。使用JPQL。并且不要从数据库中加载所有用户来查找具有给定用户名的用户。使用查询查找具有该用户名的用户。
    public boolean checkUserLogin(String uname,String pass)
        {
            boolean login=false;
            try {
                Configuration cfg = new Configuration().configure().addAnnotatedClass(User.class);
                SessionFactory sf = cfg.buildSessionFactory();
                Session session = sf.openSession();
                Transaction tr = session.beginTransaction();
    
                CriteriaBuilder builder =   session.getCriteriaBuilder();
                CriteriaQuery<String[]> criteriaquery = builder.createQuery(String[].class);
                Root<User> root = criteriaquery.from(User.class);
    
                Path<String> usernamePath = root.get("userName");
                Path<String> passwordPath = root.get("password");
    
                criteriaquery.multiselect(usernamePath,passwordPath);
    
    
                Query<String[]> query = session.createQuery(criteriaquery);
                List<String[]> list =   query.list();
    
                for(String[] s:list)
                {
    
                    if(s[0].equals(uname) && s[1].equals(pass))
                    {
                        login=true;
                    }
    
                    else
                    {
                        login=false;
                    }
                }
    
                tr.commit();
    
    
    
            } catch (HibernateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return login;
    
        }
    
    public boolean checkUserLogin(String uname, String pass) {
    
        boolean login = false;
    
        try {
    
    
            Configuration cfg = new 
                Configuration().configure().addAnnotatedClass(User.class);
    
            SessionFactory sf = cfg.buildSessionFactory();
    
            Session session = sf.openSession();
    
            Transaction tr = session.beginTransaction();
    
    
            CriteriaBuilder builder = session.getCriteriaBuilder();
    
            CriteriaQuery<Tuple> criteriaquery = builder.createQuery(Tuple.class);
            Root<User> root = criteriaquery.from(User.class);
    
            Path<String> usernamePath = root.get("username");
            Path<String> passwordPath = root.get("password");
    
            criteriaquery.multiselect(usernamePath, passwordPath);
    
            criteriaquery.where(builder.equal(root.get("username"), uname), builder.equal(root.get("password"), pass));
    
            Query<Tuple> query = session.createQuery(criteriaquery);
    
            Tuple _userRec = query.getSingleResult();
            System.out.println("user -> " + _userRec.get(0, String.class) + ", pass -> " + _userRec.get(1, String.class));
    
            if (_userRec != null) {
                login = true;
            }
    
            tr.commit();
    
        } catch (HibernateException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        return login;
    }