[英]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.