getText () против getPassword () - PullRequest
4 голосов
/ 21 марта 2012

В настоящее время я разрабатываю систему входа в систему для фиктивной компании, сейчас все, что у меня есть, - это основной вход в систему, который нуждается в тщательной очистке.Ниже мой обработчик входа в систему.

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 ]

12 голосов
/ 21 марта 2012

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

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

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

11 голосов
/ 21 марта 2012

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

5 голосов
/ 21 марта 2012

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

if (Arrays.equals(password.getPassword(), new char[]{'p','a','s','s','w','o','r','d'}))
2 голосов
/ 15 декабря 2014

Как и во всех других ответах, JPasswordField возвращает символ [] при вызове метода 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());
...