如果在JavaFX中没有找到任何结果集,则显示警报

问题描述:

此代码用于在单击按钮后显示错误。 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

从代码中删除您警觉你拥有它。创建一个静态方法。将完整的警报代码放在那里。在你当前有alert.showandwait()的地方调用你的新的静态方法。

+0

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

+0

了解更多关于安全登录的知识?这对我很有帮助。 https://www.javacodegeeks.com/2012/05/secure-password-storage-donts-dos-and.html – Sedrick

由于ResultSet.next的回报,如果存在多个行,你可能只是做

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

或选择使用SELECT COUNT(*) FROM ...和第一行检查的第一列:

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

注:我将不会详细说明SQL注入或其他严重的安全问题,如允许读取密码和用户名信息...