java - Java 验证码不正确

标签 java jdbc

我有验证功能,但是当我输入正确的登录名和密码时,即使数据正确,它总是显示数据不正确。

代码

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");  
}

在此行之后,用户名密码变量将保存最后一行的值。

您现在可能会明白,只有用户表中最后插入的用户登录才会成功,因为您正在将登录信息与最后一行的值进行比较。

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 接口(interface)的强制转换也没有意义。确保仅导入 java.sql 类,而不是数据库供应商特定的类。大写的实例/局部变量名称(例如 UsernamePassword)也不会为您提供关于 Java 代码约定的额外分数。

关于java - Java 验证码不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25610848/

相关文章:

java - 在带有 JFrame 表单的 Netbeans derby 中使用带有 WHERE 子句的 SELECT 语句

mysql - JDBC 交互连接

java - 通过 ui :repeat in JSF 内的 jQuery UI 小部件访问附加值

java - Spring Boot JPA Starter 的 Spring Boot 启动问题

java - 处理列表流并收集到只有非空值的 map/ImmutableMap

java - SQLServer jdbc批量执行性能

java - 将 JDBC 连接到 Sql Server 2012 时出现 SSLv3 错误?

java - Swagger 自定义文档

java - 引导日期选择器和 LocalDate 之间的一天转换

jdbc - MyBatis映射器中是否需要jdbcType?