2014-09-01 33 views
0

我有一個認證功能,但是當我輸入正確的登錄名和密碼時,即使它是正確的,它也總是顯示數據不正確。不正確的Java認證碼

代碼

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

    } 

回答

2

你從DB拖拉整個用戶表到Java的內存:

String sql = "select * from gestionticket.user " ;  
ResultSet resultat = (ResultSet) instruction.executeQuery(sql); 

然後你在每一行循環提取登錄名和密碼:

while(resultat.next()){ 
    Username = resultat.getString("login"); 
    Password = resultat.getString("password"); 
} 

在此行之後,UsernamePassword變量將保留最後一行的值爲

您現在可能會明白,登錄只會對用戶表中最後插入的用戶成功,因爲您將登錄與最後一行的值進行比較。

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類,而不導入數據庫供應商特定的類。像UsernamePassword這樣的大寫的實例/局部變量名稱也不會爲Java代碼約定提供額外的意見。

+0

Merciii Beaucoup – khadija 2014-09-01 18:07:12

+0

:我想比較inputText的內容和db中的數據 – khadija 2014-09-01 18:10:15

+0

不可以。數據庫已經通過WHERE來做到這一點。或者,如果它返回與給定用戶名/密碼匹配的正確記錄,那麼您是否信任數據庫?爲什麼不? – BalusC 2014-09-01 18:11:45