2016-12-06 72 views
0

此代碼用於在單擊按鈕後顯示錯誤。 buttonclick所做的是檢查用戶名和密碼是否與數據庫中的用戶名和密碼一致。如果在JavaFX中沒有找到任何結果集,則顯示警報

如果屬實,它會顯示下一個場景。如果錯誤,我想表明我犯的錯誤。顯示下一個場景工作正常,顯示錯誤沒有。

這是我的代碼:

public Pane createLogin() throws SQLException { 
    GridPane gridPane = new GridPane(); 
    gridPane.setHgap(10); 
    gridPane.setVgap(10); 
    gridPane.setPadding(new Insets(20, 150, 10, 10)); 

    Button login = new Button("Login!"); 
    TextField usernameField = new TextField(); 
    usernameField.setPromptText("Username"); 
    PasswordField passwordField = new PasswordField(); 
    passwordField.setPromptText("Password"); 
    Alert alert = new Alert(Alert.AlertType.ERROR); 
    alert.setTitle("ERROR"); 
    alert.setHeaderText("OH SNAP"); 
    alert.setContentText("I have a great message for you!"); 

    login.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent event) { 

      String username = usernameField.getText(); 
      String password = passwordField.getText(); 
      String query = "Select * from user WHERE username ='" + username + "' and password ='" + password + "'"; 
      ResultSet rs = null; 
      System.out.println("hahah:" + username); 
      try { 
       rs = dataBase.executeQuery(query); 
       dataBase.executeDataRowQuery(query); 
       while (rs.next()) { 
        if (username.equals(rs.getString("username"))) { 
         if (password.equals(rs.getString("password"))) { 
          switchScreen(createOverview()); 
         } else{ 
          alert.showAndWait(); 
         } 
        } else{ 
         alert.showAndWait(); 
        } 
        alert.showAndWait(); 
       } 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 


     } 
    }); 
    gridPane.add(new Label("Username: "), 0, 0); 
    gridPane.add(usernameField, 0, 1); 
    gridPane.add(new Label("Password: "), 1, 0); 
    gridPane.add(passwordField, 1, 1); 

    gridPane.add(new Label("Login!"), 2, 0); 
    gridPane.add(login, 2, 1); 

    return gridPane; 
} 
+2

[Little bobby tables](http://bobby-tables.com/)會很自豪..如果沒有記錄,你不會輸入,因爲rs.next()返回false! – 2016-12-06 12:40:45

回答

0

從代碼中刪除您警覺你擁有它。創建一個靜態方法。將完整的警報代碼放在那裏。在你當前有alert.showandwait()的地方調用你的新的靜態方法。

+0

只是一個額外的好處。我知道你可以做得更好,而不是那句話。就像if(this && that){} else {} – Sedrick

+0

瞭解更多關於安全登錄的知識?這對我很有幫助。 https://www.javacodegeeks.com/2012/05/secure-password-storage-donts-dos-and.html – Sedrick

1

由於ResultSet.next的回報,如果存在多個行,你可能只是做

if (rs.next()) { 
    switchScreen(createOverview()); 
} else { 
    alert.showAndWait(); 
} 

或選擇使用SELECT COUNT(*) FROM ...和第一行檢查的第一列:

if (rs.next() && rs.getInt(1) > 0) 
    ... 

注:我將不會詳細說明SQL注入或其他嚴重的安全問題,如允許讀取密碼和用戶名信息...

相關問題