#java #jsf
#java #jsf
Вопрос:
Я написал простой код для проверки логина и пароля (логин и пароль задаются пользователем), а затем сравниваю их по логину и паролю, хранящимся в базе данных. но проблема в том, что функция возвращает неверный результат (она просматривает все строки, даже если в первой строке указано 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)) amp;amp; !(this.password.equalsIgnoreCase(value) )amp;amp; !(iteratorkey.hasNext()) )
{
checkaccess ="fail";
}
else
checkaccess ="success";
}
}
catch (SQLException e)
{
e.printStackTrace();
}
return checkaccess;
}
Ответ №1:
Я не понимаю, почему вы загружаете карту логинов и паролей для каждого запроса. Вы могли бы просто загрузить пароль для данного входа, и если это не удается, логин не существует.
Кроме того, мне интересно, действительно ли вы хотите игнорировать регистр паролей и логинов.
Представленный вами код завершается с ошибкой, потому что вы не выходите из цикла, когда находите соответствующий логин / пароль.
Вам действительно следует провести рефакторинг кода и устранить необходимость в картах и циклировании. Как я уже сказал, просто найдите логин, который пользователь представляет в вашей базе данных.
Комментарии:
1. Я хочу связать каждый логин с эквивалентным паролем
2. @Rym хорошо, тогда название метода вводит в заблуждение. Я думал, вы хотите проверить пароль для одного заданного входа.
3. ах, это моя ошибка, я забыл его изменить
Ответ №2:
Существует несколько проблем:
- SQL-запрос возвращает результирующий набор для всех пользователей. Вы могли бы указать предложение WHERE, которое ограничивало бы это 0 или 1 строками, в зависимости от того, существует пользователь или нет.
- Код выполняет итерацию результатов и устанавливает флаг. Если флаг установлен один раз, он может (и будет) сброшен на следующей итерации. Вы должны выйти из цикла (чтобы после того, как аутентификация считается успешной, ее нельзя было считать неудачной для предоставленных идентификатора пользователя и пароля). Но если бы вы хотели устранить предыдущую проблему, тогда вам вообще не нужен цикл.
- Нет необходимости хранить содержимое результирующего набора в map. Это избыточно, поскольку карта перестраивается при каждом запросе и отбрасывается после выполнения.