4

我目前正在为一家虚构的公司设计一个登录系统,现在我只有主登录,需要大量清理。下面是我的登录处理程序。

private class LoginButtonHandler implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        if(_uid.getText().equalsIgnoreCase("Nathan") && _pwd.getText().equals("password")) {
            JOptionPane.showMessageDialog(null, "Congratulations on logging in!");
        } else {
          JOptionPane.showMessageDialog(null, "Error on login!");
        }
    }
}

照原样,这工作得很好,但是当我把它改成

_pwd.getPassword.equals("password")

当一切都正确输入时,它直接指向 else 语句。这里有什么问题?完整程序如下。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main extends JFrame {
    private static final int HEIGHT = 90;
    private static final int WIDTH = 400;

    JTextField _uid = new JTextField(10);
    JPasswordField _pwd = new JPasswordField(10);
    JButton _login = new JButton("Login");
    JButton _reset = new JButton("Reset");

    public Main() {
       super("Login - Durptech");
        Container pane = getContentPane();
        setLayout(new FlowLayout());

        add(new JLabel("User ID:"));
            add(_uid);
        add(new JLabel("Password:"));
            add(_pwd);

            add(_login);
                _login.addActionListener(new LoginButtonHandler());
            add(_reset);
                _reset.addActionListener(new ResetButtonHandler());

        /*if(_uid.getText().equals("") && _pwd.getText().equals("")) {
            _login.setEnabled(false);
        } else {
            _login.setEnabled(true);
        }*/

       setSize(WIDTH, HEIGHT);
       setResizable(false);
       setLocation(500, 300);
       setDefaultCloseOperation(EXIT_ON_CLOSE);
       setVisible(true);
    }

    private class ResetButtonHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            _uid.setText("");
            _pwd.setText("");
            _uid.requestFocusInWindow();
        }
    }

    private class LoginButtonHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            if(_uid.getText().equalsIgnoreCase("Nathan") && _pwd.getText().equals("password")) {
                JOptionPane.showMessageDialog(null, "Congratulations on logging in!");
            } else {
              JOptionPane.showMessageDialog(null, "Error on login!");
            }
        }
    }

    public static void main(String[] args) {
        new Main();
    }
}
4

4 回答 4

13

你会想很好地了解 API,让它成为你最好的朋友。解决这个问题的关键是看什么JPasswordField#getPassword()返回。提示 1:它不是字符串。提示 2:您可能希望使用 java.util.Arrays 类方法解决此问题。

getPassword 不返回字符串的原因是因为 Java 处理字符串的方式——它可以将它们存储在字符串池中,允许字符串在程序中停留的时间比您预期的要长,并且可以通过以下方式检索字符串恶意软件——您不希望密码发生的事情。使用 char 数组要安全得多。

顺便说一句,不要使用 JPasswords 已弃用getText()的方法或使用构造函数将 char 数组更改为 String,new String(char[])因为它们都返回 String,它们不安全。

于 2012-03-21T03:07:12.423 回答
11

JPasswordField.getPassword()返回 achar []而不是 a String。这样做是为了安全。您应该比较数组中的字符,而不是查看 char [] .equals(a String);

于 2012-03-21T03:09:03.143 回答
6

password.getPassword()返回一个 char[],并且 char[] 不等于字符串。所以你需要将它与 char[] 进行比较:

if (Arrays.equals(password.getPassword(), new char[]{'p','a','s','s','w','o','r','d'}))
于 2012-03-21T03:09:46.597 回答
2

正如所有其他答案所说,当您调用 getPassword() 方法时, JPasswordField 返回一个 char[] 。但是,我在示例登录表单中设置它的方式是我有一种验证输入的方法。我有两个用于存储用户名 [] 和密码 [] 的数组,然后我输入了用户名和密码。我的方法中输入的密码在继续之前将 char[] 更改为字符串,您可以这样做:

 String PasswordTyped = new String(_pwd.getPassword());

然后将该字符串放入您的“if”语句中:

 if (_uid.equals("Nathan") && PasswordTyped.equals("password") {
     JOptionPane.showMessageDialog(null, "Congrats, you logged in as Nathan");
 }

但是,正如我提到的,我的验证方法在用户名 [] 和密码 [] 的两个数组上运行,同时接受字符串和 char[] 作为输入。我将复制并粘贴我的方法,以便您可以根据需要进行暗示:

public static void validate(String u, Char[] pass) {
    String password = new String(pass);
    boolean uGood = false;
    String[] usernames = new String[2];
    String[] passwords = new String[usernames.length];

    usernames[0] = "Don";
    passwords[0] = "password";
    usernames[1] = "Jared";
    passwords[1] = "password";


    for (int i = 0; i < usernames.length; i++) {

        if (usernames[i].equals(u) && passwords[i].equals(password)) {
            uGood = true;
        }
    }
    if (uGood) {
        System.out.println("Hooray, you did it!");
    }
    else {
        JOptionPane.showMessageDialog(null, "Incorrect Username\nand/or Password.");
    }
}

最后,您将通过键入以下内容调用此验证方法:

validate(_uid.getText(), _pwd.getPassword());
于 2014-12-15T20:30:58.157 回答