Java 代码比较登录名和密码

Java 代码比较登录名和密码,java,jsf,Java,Jsf,我已经编写了一个简单的代码来测试登录名和密码(登录名和密码由用户提供),然后通过数据库中存储的登录名和密码对它们进行比较。但问题是函数返回的结果不好(它浏览所有行,即使第一行为true) 代码如下: public String LoginPasswordCheck(Connection con) { HashMap<String,String> mapLoginPWD = new HashMap<String,String> (); String sq

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

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;
 } 
公共字符串登录密码检查(连接con)
{ 
HashMap mapLoginPWD=newhashmap();
字符串sqlLogin;
字符串checkaccess=“true”;
字符串日志;
字符串pwd;
sqlLogin=“选择登录,来自profil_用户的密码;”;
试一试{
st=(PreparedStatement)con.prepareStatement(sqlLogin);
结果集rs1=st.executeQuery();
while(rs1.next())
{
log=rs1.getString(“登录”);
pwd=rs1.getString(“密码”);
mapLoginPWD.put(log,pwd);
} 
迭代器iteratorkey=mapLoginPWD.keySet().Iterator();
字符串myKey=“”;
字符串值=”;
while(iteratorkey.hasNext())
{
myKey=(字符串)iteratorkey.next();
value=mapLoginPWD.get(myKey);
//用户提供的登录名和密码
if(!(this.login.equalsIgnoreCase(myKey))&&(!(this.password.equalsIgnoreCase(value))&&&(iteratorky.hasNext())
{
checkaccess=“失败”;
}
其他的
checkaccess=“成功”;
}
}
捕获(SQLE异常)
{
e、 printStackTrace();
}     
返回checkaccess;
} 

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

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

您显示的代码失败,因为您在找到匹配的登录名/密码时没有退出循环


你真的应该重构代码,省去映射和循环的需要。正如我所说,只需查找用户在数据库中显示的登录名。

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

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

您显示的代码失败,因为您在找到匹配的登录名/密码时没有退出循环


你真的应该重构代码,省去映射和循环的需要。正如我所说,只需查找用户在数据库中显示的登录名。

有几个问题:

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

    • 有几个问题:

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

      我想将每个登录与等效登录关联起来password@Rym好的,那么方法名是有误导性的。我以为你想检查一个给定登录名的密码。啊,这是我的错误,我忘了更改它。我想将每个登录名与等效登录名联系起来password@Rym好的,那么方法名是有误导性的。我以为你想检查一个给定登录名的密码。啊,是我的错,我忘了更改密码