[英]Using Hibernate, how do I check if the User trying to login has a registered account in the database?
我是Hibernate和Servlets的新手,我正在开展一个非常小的项目,用户可以在酒店预订房间。
我能够成功注册/创建一个帐户,但我无法登录。
我已经尝试在DAO类中使用Criteria Queries但是它失败并带有java.lang.ClassCastException 。
login.jsp页面中的用户名和密码将发送到Login servlet ,在该servlet中创建一个新的DAO对象,并将提取的用户名和密码传递给它的方法。
DAO使用Criteria Queries来检查用户是否存在于数据库中并返回一个布尔值, Login servlet检查返回的布尔值并重定向(如果它是真的)。
登录Servlet:
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;
}
当我尝试登录时,Web浏览器会重定向到Login servlet并使用java.lang.ClassCastException停止。 大多数在线教程使用jdbc而不是Hibernate。 有没有一种简单的方法来实现Hibernate的登录?
我已经研究过这个问题,看起来它没有从query.list()
返回String[]
的数据,尽管它应该根据API文档做到这一点。
替代
作为替代方案,您可以使用Tuple
类或Object[]
下面的代码使用的是Tuple
另一个重要的一点是,用户名应该是唯一的,用于登录目的。 因此,您不需要使用query.list()
而不是query.getSingleResult()
可以使用。
此外,您还需要添加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; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.