JPasswordField возвращает некоторый хэш-код, преобразованный в строковый тип - PullRequest
2 голосов
/ 27 марта 2012

Моя программа берет имя пользователя и пароль для аутентификации пользователя перед инициализацией программы, поэтому я создал кнопку входа в систему, к которой я привязал ActionListener, как показано ниже

   login.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent event){
                if(txtUserName.getText().equals("Suraj") && (txtPwd.getPassword().toString()).equals("s123")){

                                dispose();
                                TimeFrame tFrame = new TimeFrame(userName);
                                tFrame.setVisible(true);
                                tFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                                tFrame.setLayout(new GridLayout());

                        } else {
                            JOptionPane.showMessageDialog(null,"User name or password don't match","Acces Denied", JOptionPane.ERROR_MESSAGE);
                        }

Теперь проблема возникает, даже если я ввожу правильный пароль, программа отображает ошибку mes enter image description here sage

Ответы [ 3 ]

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

getPassword() возвращает char[]. toString() на нем не возвращает содержимое в виде строки, как вы предполагаете.

Попробуйте new String(txtPwd.getPassword()).equals("s123").

Однако, есть причина, что это char[], а не строка. Попробуйте найти его с точки зрения безопасности в в javadoc.

3 голосов
/ 28 марта 2012

Примечание: это должен был быть комментарий, но он слишком длинный для этого.Подумайте над тем, чтобы дать ответы на вопросы в связанной ветке

Как уже указывалось mKorbel, в getText () и getPassword () идет довольно полное обсуждение.

Кроме того, прочитайте учебник Swing о JPasswordField, который содержит хороший пример того, как вы должны сравнивать пароль (сравнивая массивы char, а не преобразовывая массив char в a String) - небольшая копия вставки из учебника:

private static boolean isPasswordCorrect(char[] input) {
    boolean isCorrect = true;
    char[] correctPassword = { 'b', 'u', 'g', 'a', 'b', 'o', 'o' };

    if (input.length != correctPassword.length) {
        isCorrect = false;
    } else {
        isCorrect = Arrays.equals (input, correctPassword);
    }

    //Zero out the password.
    Arrays.fill(correctPassword,'0');

    return isCorrect;
}

Причину, по которой вам следует сравнивать массивы символов, хорошо объясняет Hovercraft Full Of Eels в его ответ в связанном вопросе SO в начале этого ответа.

0 голосов
/ 05 апреля 2012

У меня была такая же проблема:

private void loginActionPerformed(java.awt.event.ActionEvent evt) {

    char[] pass = passwordField.getPassword();
    String mypass = pass.toString();
    String user = (String) combo.getSelectedItem();


    try {
        String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
        Class.forName(driver);

        String db = "jdbc:odbc:LoginDB";
        con = DriverManager.getConnection(db);
        st = con.createStatement();
        String sql = "select * from Table2";
        rs = st.executeQuery(sql);

        while (rs.next()) {

            String AdminNewID = rs.getString("AdminID");
            String AdminNewPass = rs.getString("AdminPassword");

            if ((user.equals(AdminNewID)) && pass.equals(AdminNewPass)) {

                MyApp form = new MyApp();
                form.setVisible(true);

            } else {
                this.res.setText(" Incorrect User Name or Password");
            }
        }
    } catch (Exception ex) {
    }
}
...