代码比较登录名和密码

时间:2011-06-12 21:07:39

标签: java jsf

我编写了一个简单的代码来测试登录名和密码,(登录名和密码由用户提供)然后我通过存储在数据库中的登录名和密码对它们进行比较。但问题是函数返回错误结果(它浏览所有行,即使它在第一行是真的) 这是代码:

public String LoginPasswordCheck(Connection con) 
{ 
    HashMap<String,String> mapLoginPWD = new HashMap<String,String> ();
    String sqlLogin;
    String checkaccess="true";
    String log;
    String pwd; 
     sqlLogin="select login ,password from profil_user;";

    try{
   st=(PreparedStatement) con.prepareStatement(sqlLogin);
   ResultSet rs1 = st.executeQuery();

   while(rs1.next())
    {
      log = rs1.getString("login");
      pwd=rs1.getString("password");
      mapLoginPWD.put(log, pwd);
   } 

Iterator iteratorkey = mapLoginPWD.keySet().iterator(); 
String myKey="";
String value="";

while(iteratorkey.hasNext())
{
 myKey = (String) iteratorkey.next();
 value= mapLoginPWD.get(myKey);
 //login and password given by the user
 if( !(this.login.equalsIgnoreCase(myKey)) && !(this.password.equalsIgnoreCase(value) )&& !(iteratorkey.hasNext()) )
  {
          checkaccess ="fail";
  }
else

             checkaccess ="success"; 
}

}
 catch (SQLException e)
    {
       e.printStackTrace();
    }     
return checkaccess;
 } 

2 个答案:

答案 0 :(得分:4)

我不明白为什么要为每个请求加载登录名和密码的地图。您可以只加载给定登录的密码,如果失败,则登录不存在。

此外,我想知道你是否真的想忽略密码和登录的情况。

您提供的代码失败,因为您在找到匹配的登录名/密码时不会退出循环。

您应该重构代码并消除对地图和循环的需求。正如我所说,只需查看用户在您的数据库中显示的登录信息。

答案 1 :(得分:2)

有几个问题:

  • SQL查询返回所有用户的结果集。您可以指定一个WHERE子句,将其限制为0或1行,具体取决于用户是否存在。
  • 代码遍历结果,并设置一个标志。如果标志设置一次,它可以(并且将)在下一次迭代时重置。您应该打破循环(这样一旦认证成功,就不能认为提供的用户ID和密码不成功)。但是如果你要修复上一个问题,那么你首先不需要循环。
  • 不必将结果集的内容存储在地图中。这是多余的,因为地图在每个查询上重建并在执行后被丢弃。
相关问题