4

私は現在、偽りの会社のログインシステムを設計しています。現在、私が持っているのはメインログインだけで、これには多くのクリーンアップが必要です。以下は私のログインハンドラーです。

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

4 に答える 4

13

APIをよく理解して、親友にする必要があります。これを解決するための鍵は、何JPasswordField#getPassword()が返されるかを確認することです。ヒント1:文字列ではありません。ヒント2:java.util.Arraysクラスメソッドを使用してこれを解決することをお勧めします。

getPasswordが文字列を返さない理由は、Javaが文字列を処理する方法のためです。文字列を文字列プールに格納できるため、文字列をプログラムで予想よりも長くハングアウトでき、文字列を次の方法で取得できる可能性があります。マルウェア-パスワードに起こりたくないこと。char配列を使用する方がはるかに安全です。

ちなみに、JPasswordsの非推奨getText()メソッドを使用したり、コンストラクターを使用してchar配列をStringに変更したりしないでnew String(char[])ください。どちらも文字列を返すため、安全ではありません。

于 2012-03-21T03:07:12.423 に答える
11

JPasswordField.getPassword()char []の代わりにを返しますString。これはセキュリティのために行われます。char [] .equals(a String);かどうかを確認するのではなく、配列内の文字を比較する必要があります。

于 2012-03-21T03:09:03.143 に答える
6

password.getPassword()char []を返し、char[]はStringsと等しくありません。したがって、char []と比較する必要があります:

if (Arrays.equals(password.getPassword(), new char[]{'p','a','s','s','w','o','r','d'}))
于 2012-03-21T03:09:46.597 に答える
2

他のすべての回答が述べているように、getPassword()メソッドを呼び出すと、JPasswordFieldはchar[]を返します。ただし、サンプルのログオンフォームに設定する方法は、入力を検証する方法があります。usernames[]とpasswords[]を格納するための2つの配列があり、次にusername入力とpassword入力があります。私のメソッドに入力されたパスワードは、続行する前にchar []を文字列に変更します。これは、次のように行うことができます。

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

次に、その文字列を取得して、「if」ステートメントに配置します。

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

ただし、前述したように、検証メソッドは、usernames[]とpasswords[]の2つの配列で実行され、入力として文字列と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.");
    }
}

最後に、次のように入力して、この検証メソッドを呼び出します。

validate(_uid.getText(), _pwd.getPassword());
于 2014-12-15T20:30:58.157 に答える