Используя Hibernate, как я могу проверить, имеет ли пользователь, пытающийся войти, зарегистрированную учетную запись в базе данных? - PullRequest
0 голосов
/ 02 июня 2019

Я новичок в Hibernate и Servlets, я работаю над очень маленьким проектом, в котором пользователи могут бронировать номера в отеле.

Я могу успешно зарегистрироваться / создать учетную запись,но я не могу войти в систему.

Я пытался использовать критерии критериев в классе DAO, но это не удается с java.lang.ClassCastException .

Имя пользователя и пароль со страницы login.jsp отправляются сервлету Login , где создается новый объект DAO и извлеченные имя пользователя и пароль передаются его методу.

DAO использует критерии запросов, чтобы проверить, присутствует ли пользователь в базе данных, и возвращает логическое значение, сервлет Login проверяет возвращенное логическое значение и перенаправляет, если оно истинно.

Сервлет входа в систему:

String uname = request.getParameter("uname");
String pass = request.getParameter("pass");

HttpSession session = request.getSession(true);

       try 
       {
             UserLoginDAO uldao = new UserLoginDAO();
             boolean login = uldao.checkUserLogin(uname, pass);
            if(login==true)
            {
                response.sendRedirect("room.jsp");

            }
            else
            {
                response.sendRedirect("index.jsp");
            }

            } catch (Exception e) 
            {
                e.printStackTrace();
            }

Класс DAO:

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;

    }

Когда я пытаюсь войти, веб-браузер перенаправляет наЛогин сервлета и останавливается с java.lang.ClassCastException .Большинство онлайн-уроков используют jdbc вместо Hibernate.Есть ли простой способ реализовать вход в Hibernate?

1 Ответ

0 голосов
/ 07 июня 2019

Я рассмотрел эту проблему, и похоже, что он не возвращает данные в String[] из query.list(), хотя должен делать это в соответствии с документацией API.

Альтернатива

В качестве альтернативы вы можете использовать класс Tuple или Object[]

  1. Приведенный ниже код использует Tuple

  2. Другим важным моментом является то, что ожидается, что имя пользователя будет уникальным и будет использоваться для входа в систему.Поэтому вам не нужно использовать query.list(), скорее всего, query.getSingleResult() можно использовать.

  3. А также необходимо добавить условие where, чтобы из базы данных извлекались только пользовательские записи, специфичные для пользователя и передачи, которые вы передали этому методу.Без метода 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;
    }
    
...