getText()vs getPassword()

Nat*_*der 4 java passwords swing jpasswordfield

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

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!");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

原样,这种方法非常好,但是当我改为它时

_pwd.getPassword.equals("password")
Run Code Online (Sandbox Code Playgroud)

当一切输入正确时,它会直接指向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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Hov*_*els 12

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

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

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


bla*_*nda 11

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


use*_*421 5

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

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

  • 你确定吗?我认为equals不会将一个数组与另一个数组进行比较,因为数组不会覆盖该方法,并且最终使用Object类的默认相等方法,它只是对象相等(`==`).而是使用`java.util.Arrays#equals(...)`或`java.util.Arrays#deepEquals(...)`方法. (2认同)