不正确的Java身份验证代码
我有一个身份验证功能,但当我输入正确的登录名和密码时,它总是显示数据不正确,即使它是正确的 代码不正确的Java身份验证代码,java,jdbc,Java,Jdbc,我有一个身份验证功能,但当我输入正确的登录名和密码时,它总是显示数据不正确,即使它是正确的 代码 private String login1; private String password; private String Username=""; private String Password=""; @Override public void authentification() { try { Class.forName("
private String login1;
private String password;
private String Username="";
private String Password="";
@Override
public void authentification() {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
String url = "jdbc:mysql://localhost:3306/gestionticket" ; // a JDBC url
String user = "root";
java.sql.Connection connection = DriverManager.getConnection(url, user,"");
Statement instruction = (Statement) ((java.sql.Connection) connection).createStatement();
String sql = "select * from gestionticket.user " ;
ResultSet resultat = (ResultSet) instruction.executeQuery(sql);
while(resultat.next()){
Username = resultat.getString("login");
Password = resultat.getString("password");
}
if (login1.equals(Username) && password1.equals(Password)) {
System.out.println("Successful Login!\n----");
} else {
System.out.println("Incorrect \n----");
}
}
catch (Exception e) {
e.printStackTrace();
}
}
您正在将整个用户表从数据库拖到Java内存中:
String sql = "select * from gestionticket.user " ;
ResultSet resultat = (ResultSet) instruction.executeQuery(sql);
然后在每一行上循环提取登录名和密码:
while(resultat.next()){
Username = resultat.getString("login");
Password = resultat.getString("password");
}
在此行之后,Username
和Password
变量将保存最后一行的值
您现在可能已经了解,只有在用户表中插入的最后一个用户登录成功,因为您正在将登录与最后一行的值进行比较
if (login1.equals(Username) && password1.equals(Password)) {
整个方法毫无意义。您没有使用SQL的功能。您似乎不知道
WHERE
子句的存在。您只需询问数据库用户是否存在。然后,它将返回1条与登录名匹配的记录,或者什么都不返回。这里有一个重写:
PreparedStatement instruction = connection.prepareStatement("select * from gestionticket.user where login = ? and password = ?");
instruction.setString(1, Username);
instruction.setString(2, Password);
ResultSet resultat = instruction.executeQuery();
if (resultat.next()) {
System.out.println("Successful Login!\n----");
} else {
System.out.println("Incorrect \n----");
}
请注意,您的代码有比这更大的问题。你正在泄漏数据库资源。您似乎将密码以明文形式保存,而不是散列形式保存。在
java.sql
接口上的所有这些强制转换也没有意义。确保只导入java.sql
类,而不是特定于DB供应商的类。大写的实例/局部变量名称,如Username
和Password
也不会给您提供Java代码约定方面的额外分数。您正在将整个用户表从数据库拖到Java内存中:
String sql = "select * from gestionticket.user " ;
ResultSet resultat = (ResultSet) instruction.executeQuery(sql);
然后在每一行上循环提取登录名和密码:
while(resultat.next()){
Username = resultat.getString("login");
Password = resultat.getString("password");
}
在此行之后,Username
和Password
变量将保存最后一行的值
您现在可能已经了解,只有在用户表中插入的最后一个用户登录成功,因为您正在将登录与最后一行的值进行比较
if (login1.equals(Username) && password1.equals(Password)) {
整个方法毫无意义。您没有使用SQL的功能。您似乎不知道
WHERE
子句的存在。您只需询问数据库用户是否存在。然后,它将返回1条与登录名匹配的记录,或者什么都不返回。这里有一个重写:
PreparedStatement instruction = connection.prepareStatement("select * from gestionticket.user where login = ? and password = ?");
instruction.setString(1, Username);
instruction.setString(2, Password);
ResultSet resultat = instruction.executeQuery();
if (resultat.next()) {
System.out.println("Successful Login!\n----");
} else {
System.out.println("Incorrect \n----");
}
请注意,您的代码有比这更大的问题。你正在泄漏数据库资源。您似乎将密码以明文形式保存,而不是散列形式保存。在
java.sql
接口上的所有这些强制转换也没有意义。确保只导入java.sql
类,而不是特定于DB供应商的类。大写的实例/局部变量名称,如Username
和Password
也不会给您提供Java代码约定方面的额外分数。您正在将整个用户表从数据库拖到Java内存中:
String sql = "select * from gestionticket.user " ;
ResultSet resultat = (ResultSet) instruction.executeQuery(sql);
然后在每一行上循环提取登录名和密码:
while(resultat.next()){
Username = resultat.getString("login");
Password = resultat.getString("password");
}
在此行之后,Username
和Password
变量将保存最后一行的值
您现在可能已经了解,只有在用户表中插入的最后一个用户登录成功,因为您正在将登录与最后一行的值进行比较
if (login1.equals(Username) && password1.equals(Password)) {
整个方法毫无意义。您没有使用SQL的功能。您似乎不知道
WHERE
子句的存在。您只需询问数据库用户是否存在。然后,它将返回1条与登录名匹配的记录,或者什么都不返回。这里有一个重写:
PreparedStatement instruction = connection.prepareStatement("select * from gestionticket.user where login = ? and password = ?");
instruction.setString(1, Username);
instruction.setString(2, Password);
ResultSet resultat = instruction.executeQuery();
if (resultat.next()) {
System.out.println("Successful Login!\n----");
} else {
System.out.println("Incorrect \n----");
}
请注意,您的代码有比这更大的问题。你正在泄漏数据库资源。您似乎将密码以明文形式保存,而不是散列形式保存。在
java.sql
接口上的所有这些强制转换也没有意义。确保只导入java.sql
类,而不是特定于DB供应商的类。大写的实例/局部变量名称,如Username
和Password
也不会给您提供Java代码约定方面的额外分数。您正在将整个用户表从数据库拖到Java内存中:
String sql = "select * from gestionticket.user " ;
ResultSet resultat = (ResultSet) instruction.executeQuery(sql);
然后在每一行上循环提取登录名和密码:
while(resultat.next()){
Username = resultat.getString("login");
Password = resultat.getString("password");
}
在此行之后,Username
和Password
变量将保存最后一行的值
您现在可能已经了解,只有在用户表中插入的最后一个用户登录成功,因为您正在将登录与最后一行的值进行比较
if (login1.equals(Username) && password1.equals(Password)) {
整个方法毫无意义。您没有使用SQL的功能。您似乎不知道
WHERE
子句的存在。您只需询问数据库用户是否存在。然后,它将返回1条与登录名匹配的记录,或者什么都不返回。这里有一个重写:
PreparedStatement instruction = connection.prepareStatement("select * from gestionticket.user where login = ? and password = ?");
instruction.setString(1, Username);
instruction.setString(2, Password);
ResultSet resultat = instruction.executeQuery();
if (resultat.next()) {
System.out.println("Successful Login!\n----");
} else {
System.out.println("Incorrect \n----");
}
请注意,您的代码有比这更大的问题。你正在泄漏数据库资源。您似乎将密码以明文形式保存,而不是散列形式保存。在
java.sql
接口上的所有这些强制转换也没有意义。确保只导入java.sql
类,而不是特定于DB供应商的类。大写的实例/局部变量名,如Username
和Password
也不会给您提供Java代码约定方面的额外分数。:我想将inputText的内容与数据库号中的数据进行比较。你不应该。DB已经通过WHERE
实现了这一点。或者,如果DB返回与给定用户名/密码匹配的正确记录,您不信任它吗?为什么不呢?:我想将inputText的内容与dbNo中的数据进行比较。你不应该。DB已经通过WHERE
实现了这一点。或者,如果DB返回与给定用户名/密码匹配的正确记录,您不信任它吗?为什么不呢?:我想将inputText的内容与dbNo中的数据进行比较。你不应该。DB已经通过WHERE
实现了这一点。或者如果DB返回正确的记录matc,您不信任它吗