5

您好我正在尝试在 java netbeans IDE 中创建一个登录表单。我的目标是创建多个用户 ID 及其各自的密码。我已将文本字段提供给 userID 和 passwordField 以获取密码以获取值,但问题是我想从密码字段中获取文本,但我无法获取它显示一些错误我认为语法有问题我的研究是如下有什么解决办法吗?需要你的帮助

private void lb_loginMouseClicked(java.awt.event.MouseEvent evt) {                                      
       DBUtil util = new DBUtil();
       String value1=tb_uid.getText();
       String value2=tb_pwd.getPassword();
       String user1="";
       String pass1="";
       try {

            Connection con = util.getConnection();
            PreparedStatement stmt = con.prepareStatement("SELECT * FROM login where username='"+value1+"' && password='"+value2+"'");
            ResultSet res = stmt.executeQuery();
            res = stmt.executeQuery();
            while (res.next()) {
                user1 = res.getString("username");
                pass1 = res.getString("password");
            }
            if (value1.equals(user1) && value2.equals(pass1)) {
            JOptionPane.showMessageDialog(this,"correct");
            }
            else{
            JOptionPane.showMessageDialog(this,"Incorrect login or password","Error",JOptionPane.ERROR_MESSAGE);
            }
            JOptionPane.showMessageDialog(null, "COMMITED SUCCESSFULLY!");
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());

        }

    }  
4

5 回答 5

8
String pwd = new String(jPasswordField1.getPassword());

选项1:

jTextField1.setText(""+pwd);

选项 2:

System.out.println(""+pwd);
于 2016-12-20T18:02:52.017 回答
6

使用此代码:

String password = String.valueOf(jPasswordField.getPassword());

是加密的JPasswordField,但如果你使用String.valueOf它将把 Char 转换为 String。

于 2014-12-22T08:56:07.277 回答
3

value2是 char 数组,因此进行String连接将导致String数组的表示,而不是String内容本身最终出现在 SQL 中。你可以更换

PreparedStatement stmt = con.prepareStatement("SELECT * FROM login where username='"+value1+"' && password='"+value2+"'");

PreparedStatement stmt = con.prepareStatement("SELECT * FROM login where username='"+value1+"' AND password='" + new String(value2) + "'");

相似地

if (value1.equals(user1) && value2.equals(pass1)) {

需要是

if (value1.equals(user1) && pass1.equals(new String(value2)) {

但是,最好使用PreparedStatement占位符来防止SQL 注入攻击:

PreparedStatement stmt = con.prepareStatement("SELECT * FROM login where username=? AND password=?);
stmt.setString(1, value1);
stmt.setString(2, new String(value2));

注意:这不是密码查找的安全方法,散列比较会相对更安全。

于 2013-01-04T17:55:40.477 回答
0

来自http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#equals%28java.lang.Object%29

等于

公共布尔等于(对象anObject)

将此字符串与指定对象进行比较。当且仅当参数不为 null 并且是表示与此对象相同的字符序列的 String 对象时,结果才为真。

你的代码:

char[] value2=tb_pwd.getPassword();
...
String pass1="";
...
...&& value2.equals(pass1)...

似乎您想将 char 数组转换为 String 然后重试转换。如果您仍然收到错误,请将其与相关输入一起发布,以便我们查看收到的内容。

于 2013-01-04T17:55:14.173 回答
0

您想将您的转换char[]String. 当您调用 tb_pwd.getPassword() 时,将返回一个 char[](字符数组)。如果要比较此密码,则必须将其转换为字符串,为此您可以使用以下方法:

String final_pass = "";
for(char x : passwordAsChar[]) {
     final_pass += x;
}

至于比较数据库中的密码,您永远不应该以未加密的纯文本形式存储它们。您可以在数据库中存储一个 MD5 字符串,并将用户输入的密码转换为字符串,然后在其上调用以下方法。然后将返回的字符串与数据库中的字符串进行比较。如果它们匹配,则用户输入了正确的密码。

例子:

char[] pass = tb_pwd.getPassword();
String final_pass = "";
for (char x : pass) {
    final_pass += x;
}

String md5_encrypted_pass_userInput = encrypt(final_pass);
if (md5_encrypted_pass.equals(pass1)) { /* pass1 = the password from the database */
    // Correct password
}

用于将字符串加密为 MD5 的方法是:

public static final String encrypt(String md5) {
    try {
        java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
        byte[] array = md.digest(md5.getBytes());
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < array.length; ++i) {
          sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
       }
        return sb.toString();
    } catch (java.security.NoSuchAlgorithmException e) {}
    return null;
}
于 2013-01-04T20:46:44.140 回答