getText()vs getPassword()

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

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(); } } 

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

 if (Arrays.equals(password.getPassword(), new char[]{'p','a','s','s','w','o','r','d'})) 

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

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

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

JPasswordField.getPassword()返回char []而不是String 。 这是为了安全起见。 你应该比较数组中的字符而不是查看char [] .equals(一个字符串);

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

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

然后取出该字符串并将其放在“if”语句中:

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

但是,正如我所提到的,我的validation方法在两个用户名[]和密码[]数组上运行,同时接受一个字符串和一个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."); } } 

最后,您可以通过键入以下内容来调用此validation方法

 validate(_uid.getText(), _pwd.getPassword());