使用 JDBC 检查 Db 的凭据
Checking Credentials against Db using JDBC
我一直在尝试让这段代码工作一段时间,但似乎行不通。我的用户输入用户名和密码,然后程序将其与数据库进行比较。然而它显示无效凭据,即使当我输出密码时它显示完全相同我有 input.Just 几点,我知道你们中的一些人会指出诸如使用单独的 class 之类的事情连接,检查用户名的密码而不是使用 Select *,使用散列和所有。但是现在我只需要让这段代码工作。只有在那之后,我才能在其他方面工作以提高其效率。提前谢谢大家。:)
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());
}
}
那两行:
Username1 = "jTextField1.getText()";
Password1 = "jPassword1Field2.geText()";
它们是字符串文字,因此除非您的密码字面上是 jPassword1Field2.geText(),否则不会匹配。我想你的意思是:
Username1 = jTextField1.getText();
Password1 = jPassword1Field2.getText();
但是请注意,JPasswordField.getText()
is deprecated since Java 2. You should use getPassword()
而不是:
Password1 = new String(jPassword1Field2.getPassword());
文档证明了 getText()
和 "security reasons" 的弃用是合理的,我无法声称理解,但您仍然不应该使用 API 的弃用部分。
我已经知道你下面的一些内容,none 是你问题的一部分,但我真的建议你
- 检查用户名。原因应该很明显。
- 哈希密码。总是。
- 只获取您需要的内容,主要是出于性能原因。通常最好的方法是在 SQL 中使用
WHERE
子句(这需要清理您的输入,但无论如何您都应该这样做)并构建列列表而不是获取 *
.
- 在 SQL 中对 database/table/column 名称使用反引号以避免意外使用关键字作为 table/column 名称等情况。
应用以上内容,我建议进行以下查询(假设名称字段被称为 Username
):
PreparedStatement st = conn.prepareStatement("SELECT `Password` FROM `Identification` WHERE `Username` = ?");
st.setString(1, Username1);
ResultSet rs = st.executeQuery();
我一直在尝试让这段代码工作一段时间,但似乎行不通。我的用户输入用户名和密码,然后程序将其与数据库进行比较。然而它显示无效凭据,即使当我输出密码时它显示完全相同我有 input.Just 几点,我知道你们中的一些人会指出诸如使用单独的 class 之类的事情连接,检查用户名的密码而不是使用 Select *,使用散列和所有。但是现在我只需要让这段代码工作。只有在那之后,我才能在其他方面工作以提高其效率。提前谢谢大家。:)
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());
}
}
那两行:
Username1 = "jTextField1.getText()";
Password1 = "jPassword1Field2.geText()";
它们是字符串文字,因此除非您的密码字面上是 jPassword1Field2.geText(),否则不会匹配。我想你的意思是:
Username1 = jTextField1.getText();
Password1 = jPassword1Field2.getText();
但是请注意,JPasswordField.getText()
is deprecated since Java 2. You should use getPassword()
而不是:
Password1 = new String(jPassword1Field2.getPassword());
文档证明了 getText()
和 "security reasons" 的弃用是合理的,我无法声称理解,但您仍然不应该使用 API 的弃用部分。
我已经知道你下面的一些内容,none 是你问题的一部分,但我真的建议你
- 检查用户名。原因应该很明显。
- 哈希密码。总是。
- 只获取您需要的内容,主要是出于性能原因。通常最好的方法是在 SQL 中使用
WHERE
子句(这需要清理您的输入,但无论如何您都应该这样做)并构建列列表而不是获取*
. - 在 SQL 中对 database/table/column 名称使用反引号以避免意外使用关键字作为 table/column 名称等情况。
应用以上内容,我建议进行以下查询(假设名称字段被称为 Username
):
PreparedStatement st = conn.prepareStatement("SELECT `Password` FROM `Identification` WHERE `Username` = ?");
st.setString(1, Username1);
ResultSet rs = st.executeQuery();