簡體   English   中英

Java JDBC swing登錄表單錯誤

[英]Java JDBC swing login form error

我目前正在從事一個簡單的JDBC項目,並且停留在登錄表單上

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    try
{
    Class.forName("com.mysql.jdbc.Driver");
    con=DriverManager.getConnection("jdbc:mysql://localhost/company","root","redhat");
    stmt=con.createStatement(); 
    String nm=jTextField1.getText();
    char[] pass=jPasswordField1.getPassword();
    String pw=Arrays.toString(pass);
    String sql="select * from login where uname='"+nm+"' and pass='"+pw+"'";
    rs=stmt.executeQuery(sql);
    if(rs.next())
     {
      new MainPage().setVisible(true);
      this.setVisible(false);
     }
    else
     {
      JOptionPane.showMessageDialog(this, "Wrong User name or password");
      jTextField1.setText("");
      jPasswordField1.setText("");

     }
}
catch(Exception e)
{
  System.out.println(e);
}
}              `

單擊此按鈕時,將顯示一個我創建的新頁面,但它顯示“錯誤的用戶名或密碼”消息對話框。 我有什么錯 我的數據庫在mysql中。

錯誤1: Arrays.toString(char[])將返回一個數組表示形式,例如,如果jPasswordField1中的passwordpassword ,則結果為以下字符串: [p, a, s, s, w, o, r, d]

修復1:使用new String(char[])代替。


錯誤2:使用字符串串聯構建SQL語句。 這將使您的代碼容易受到SQL Injection攻擊,黑客可以在其中竊取您的數據並刪除您的表

修復2:使用PreparedStatement


錯誤3:未釋放資源。 這將導致內存泄漏。

修復3:使用try-with-resources


結果:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    try {
        boolean loginOk;
        Class.forName("com.mysql.jdbc.Driver");
        try (Connection con = DriverManager.getConnection("jdbc:mysql://localhost/company","root","redhat")) {
            String sql = "select * from login where uname=? and pass=?";
            try (PreparedStatement stmt = con.prepareStatement(sql)) {
                stmt.setString(1, jTextField1.getText());
                stmt.setString(2, new String(jPasswordField1.getPassword()));
                try (ResultSet rs = stmt.executeQuery(sql)) {
                    loginOk = rs.next();
                }
            }
        }
        if (loginOk) {
            new MainPage().setVisible(true);
            this.setVisible(false);
        } else {
            JOptionPane.showMessageDialog(this, "Wrong User name or password");
            jTextField1.setText("");
            jPasswordField1.setText("");
        }
    } catch(Exception e) {
        System.out.println(e);
    }
}

這似乎表明您的查詢返回了空結果集。 如果直接針對數據庫運行它會怎樣?

另外, Arrays.toString(...)將為您提供數組的String表示形式。 您可能需要String中數組的內容-有所不同。 嘗試改用new String(pass)

我認為“錯誤的用戶名或密碼”表示rs為空或rs'size為0。您應該檢查名稱和密碼。

Arrays.ToString返回指定數組內容的字符串表示形式。 字符串表示形式包含數組元素的列表。

在你的情況下

String pw = Arrays.toString(pass);

您應該用來獲取String形式的密碼。

String pw = String.copyValueOf(pass);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM