getText() против 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();
    }
}

person Nathan Kreider    schedule 21.03.2012    source источник
comment
Я не знаю Java, но я думаю, что отсутствие круглых скобок может иметь значение.   -  person Ry-♦    schedule 21.03.2012
comment
вот простое руководство о том, как создать экран входа в систему в режиме размаха: thepcwizard.in/2011/10/   -  person ThePCWizard    schedule 11.01.2013


Ответы (4)


password.getPassword() возвращает char[], а char[] не равны строкам. Поэтому вам нужно сравнить его с char[]:

if (Arrays.equals(password.getPassword(), new char[]{'p','a','s','s','w','o','r','d'}))
person user207421    schedule 21.03.2012
comment
Вы в этом уверены? Я не думаю, что equals будет работать для сравнения одного массива с другим, поскольку массив не переопределяет метод, и в конечном итоге вы используете метод равенства по умолчанию для класса Object, который просто выполняет равенство объектов (==). Вместо этого используйте метод java.util.Arrays#equals(...) или java.util.Arrays#deepEquals(...). - person Hovercraft Full Of Eels; 21.03.2012
comment
@HovercraftFullOfEels Конечно, глупо с моей стороны, спасибо за исправление. См. редактирование. - person user207421; 21.03.2012
comment
И, используя "password".toCharArray(), вы помещаете пароль в пул строк, независимо от того, используете ли вы метод getPassword или getText, если я не ошибаюсь. - person Robin; 21.03.2012

Вы захотите хорошо узнать API, чтобы сделать его своим лучшим другом. Ключ к решению этой проблемы — увидеть, что возвращает JPasswordField#getPassword(). Подсказка 1: это не строка. Подсказка 2: вы можете решить эту проблему с помощью методов класса java.util.Arrays.

Причина, по которой getPassword не возвращает строку, заключается в том, как Java обрабатывает строки — она может хранить их в пуле строк, позволяя строкам задерживаться в программе дольше, чем вы ожидаете, и делая строки потенциально доступными для извлечения с помощью вредоносное ПО — то, что вы не хотите, чтобы произошло с паролем. Гораздо безопаснее работать с массивами символов.

Между прочим, не используйте устаревший метод JPasswords getText() и не меняйте массив символов на строку с помощью конструктора new String(char[]), так как оба они возвращают строку и не являются безопасными.

person Hovercraft Full Of Eels    schedule 21.03.2012

JPasswordField.getPassword() возвращает char [] вместо String. Это сделано в целях безопасности. Вы должны сравнивать символы внутри массива вместо того, чтобы видеть, является ли char [] .equals(a String);

person black panda    schedule 21.03.2012

Как уже говорилось во всех других ответах, JPasswordField возвращает char[] при вызове метода getPassword(). Однако способ, которым я установил его в своей форме входа в систему, заключается в том, что у меня есть метод проверки ввода. У меня есть два массива для хранения имен пользователей [] и паролей [], а затем у меня есть ввод имени пользователя и ввод пароля. Ввод пароля в моем методе изменяет char[] на строку, прежде чем продолжить, вы можете сделать это следующим образом:

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

Затем возьмите эту строку и поместите ее в оператор if:

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

Однако, как я уже упоминал, мой метод проверки работает с двумя массивами имен пользователей [] и паролей [], принимая в качестве входных данных строку и символ []. Я скопирую и вставлю свой метод, чтобы вы могли задействовать его, если хотите:

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());
person Community    schedule 15.12.2014