PSQLException: jeu de résultats n'est pas positionné correctement, vous devrez peut-être l'appel suivant
public UserBean authenticate(String username,String password){
PostGresDAO pg=new PostGresDAO(); //creates new connection
Connection conn=pg.getConnecion(); //return connection object
PreparedStatement ps;
ResultSet rs;
String query="select password,name from scg_users where username=?";
UserBean ub=null;
boolean authenticated=false;
try{
ps=conn.prepareStatement(query);
ps.setString(1, username);
rs=ps.executeQuery();
if(rs!=null){
authenticated=password.equals(rs.getString(1)); //exception raised here
if(authenticated){
ub=new UserBean();
ub.setUser(rs.getString(2));
ub.setUsername(username);
}
}
}
catch(SQLException e){
e.printStackTrace();
}
return ub;
}
Je suis en utilisant ce code pour authentifier un utilisateur. Le nom d'utilisateur et mot de passe sont extraites à partir du paramètre de la requête et transmis à cette méthode pour l'authentification. Mais il jette un:
org.postgresql.util.PSQLException: ResultSet not positioned properly, perhaps you need to call next.
S'il vous plaît conseils.
S'il vous plaît, veuillez, s'il vous plaît ne pas stocker les mots de passe en texte clair. Le sel de mer et de hachage avec un décent de hachage à sens unique. Mieux encore, ne pas écrire de l'authentification de l'utilisateur code vous-même, utiliser les code testé par authentification qui convient avec une bibliothèque ou d'un conteneur, ou via un service comme SASL avec CRAM-MD5 défi-réponse, ou avec Kerberos. De cette façon, vous n'avez jamais besoin de voir le mot de passe utilisateur à tous. Voir par exemple crackstation.net/hashing-security.htm pour les mots de passe.
Puisque vous êtes à l'aide de Java, vous devriez regarder dans
Voir aussi stackoverflow.com/questions/5322055/password-encryption
Merci lottttt pour me guider dans la bonne direction. 🙂
Puisque vous êtes à l'aide de Java, vous devriez regarder dans
JSSE
, Java GSS
, ou de Java SASL
. Ne pas écrire votre propre schéma d'authentification.Voir aussi stackoverflow.com/questions/5322055/password-encryption
Merci lottttt pour me guider dans la bonne direction. 🙂
OriginalL'auteur Mono Jamoon | 2012-08-24
Vous devez vous connecter pour publier un commentaire.
L'erreur est vous dire exactement quel est le problème - vous n'êtes pas à l'appel de
next()
sur votre jeu de résultats à obtenir à la première ligne des résultats.Cette ligne:
est inutile pour autant que je sais; je ne crois pas
executeQuery
sera jamais retourner la valeur null. Si il y a un problème dans votre requête, une exception sera levée. Si il n'y a pas de résultats, il retourne un jeu de résultats vide. Pour voir si il ya une ligne, vous devez appelernext()
et vérifier la valeur de retour:En outre:
Juste à noter que isBeforeFirst retournera true si le curseur est positionné avant la première ligne, ce qui signifie essentiellement que vous avez un ensemble de résultats.Cependant, isBeforeFirst ne sera pas le curseur sur la première ligne. Même si votre résultat est à seulement 1 ligne (par exemple, vous avez une LIMITE de 1 de la requête), vous devez toujours utiliser next(), malheureusement, parce qu'à mon avis, qui implique une collection, pas un seul résultat.
OriginalL'auteur Jon Skeet
Parce que j'ai eu le même message quand j'ai appelé
next()
surresultSet
je vais dire à ma solution.La solution est de ne PAS appeler
resultSet.get*
sur votreresultSet
si elle est vide. Afin de faire une vérification deif(resultSet.next()){ ...
OriginalL'auteur Mihkel L.
Au lieu de
Vous devez vérifier pour
Ce sera le retour de la première ligne, s'il y a des lignes correspondantes.
OriginalL'auteur sps