使用JDBC检查凭据对Db

时间:2015-04-27 08:07:49

标签: java mysql jdbc

我一直试图让这段代码工作一段时间,但似乎不会。我的用户输入用户名和密码,然后程序将其与数据库进行比较。然而,它显示无效凭据,即使我输出密码时它显示完全相同的我输入。只有几点,我知道你们中的一些人会指出像使用单独的类连接,检查反对密码的用户名而不是使用Select *,使用hashings和all。但是现在我只需要让这段代码工作。只有在那之后,我才能在其他方面努力提高效率。提前谢谢大家。:)

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
    // TODO add your handling code here:
    Username1 = "jTextField1.getText()";
    Password1 = "jPassword1Field2.geText()";
      try 
        {
        Class.forName("com.mysql.jdbc.Driver").newInstance(); 
        String url = "jdbc:mysql://localhost:3306/"; 
        String dbName = "VideoSystem" ;
        String userName = "root"; 
        String passWord = "**mypassword**";
        Connection conn = DriverManager.getConnection(url+dbName, userName, passWord); 
        Statement st = conn.createStatement();
        String sql = ("SELECT * FROM Identification");
        ResultSet rs = st.executeQuery(sql);
        while(rs.next()) 
            { 
            password = rs.getString("Password");
            if( Password1.equals(password)) 
            {
                      MenuSelection obj1 = new MenuSelection();
                      obj1.setVisible(true);
            }
            else
            {
             JOptionPane.showMessageDialog(null, "Invalid Credentials", "System Message", JOptionPane.INFORMATION_MESSAGE);

            }
            }
        conn.close();
        }
      catch (Exception e) 
        { 
      System.err.println("Got an exception! "); 
      System.err.println(e.getMessage()); 
        } 


}

1 个答案:

答案 0 :(得分:3)

这两行:

Username1 = "jTextField1.getText()";
Password1 = "jPassword1Field2.geText()";

它们是字符串文字,因此除非您的密码字面上是 jPassword1Field2.geText(),否则不会匹配。我想你的意思是:

Username1 = jTextField1.getText();
Password1 = jPassword1Field2.getText();

但请注意,自 Java 2 以来,JPasswordField.getText()已弃用。您应该使用getPassword()代替:

Password1 = new String(jPassword1Field2.getPassword());

文档证明getText()已弃用{&n 34;安全性原因"我无法理解,但您仍然不应该使用已弃用的API部分。

我已经了解了下面的一些内容,但这些都不是你问题的一部分,但我真的建议你

  1. 检查用户名。这应该是显而易见的原因。
  2. 哈希密码。总是。
  3. 仅提取您需要的内容,主要是出于性能原因。通常最好的方法是在SQL中使用WHERE子句(这需要清理输入,但是你应该这样做)并建立一个列列而不是获取*
  4. 在SQL中对数据库/表/列名称使用反引号,以避免意外使用关键字作为表/列名称等。
  5. 应用上述内容,我建议使用以下查询(假设名称字段名为Username):

    PreparedStatement st = conn.prepareStatement("SELECT `Password` FROM `Identification` WHERE `Username` = ?");
    st.setString(1, Username1);
    ResultSet rs = st.executeQuery();