0

こんにちは、ここでやろうとしているのは、ユーザーが入力したパスワードを受け取り、if ステートメントで正しいパスワードと比較することです。

public void actionPerformed(ActionEvent event)
{
    String UsersStoredPassword = "hello";
    String UsersEnteredPassword = new String(PasswordField.getPassword());
    String Message = "The Password You Have Entered Is Correct";
    String Message1 = "You Have Entered The Wrong Password";

    if (event.getSource() == PasswordField)
    {
        if (UsersEnteredPassword == UsersStoredPassword)
        {
            JOptionPane.showMessageDialog(null, Message);
        }
        else
        {
            JOptionPane.showMessageDialog(null, Message1);
        }

    }
}

ただし、イベントはユーザーが正しいパスワードを入力したと考えていました: "hello" それはまだ message1 を示しています: "あなたは間違ったパスワードを入力しました.私はこれをやろうとしました:

public class TheHandler implements ActionListener
{
    public void actionPerformed(ActionEvent event)
    {

        String UsersStoredPassword = "hello";
        String UsersEnteredPassword = new String(PasswordField.getPassword());
        String Message = "The Password You Have Entered Is Correct";
        String Message1 = "You Have Entered The Wrong Password";

        if (event.getSource() == PasswordField)
        {
            JOptionPane.showMessageDialog(null, UsersEnteredPassword);
        }
    }
}

内部に入力されたUsersEnteredPasswordが表示されます。

4

3 に答える 3

4

コンテンツを比較しない演算子をStrings使用して2 を比較していますが、これは実際の問題ではありません。==String

ここでセキュリティの脆弱性を作成しました。

説明: によって返された を使用することを優先してJPassword.getText使用することを避けるために、 は意図的に廃止されました。Stringschar[]getPassword

呼び出すgetTextと、(リフレクションを除いて)変更できない文字列(不変オブジェクト)を取得するため、パスワードはガベージコレクションされるまでメモリに残ります。

ただし、char 配列は変更される可能性があるため、パスワードは実際にはメモリに残りません。

Array.equals代わりに使用

if (Arrays.equals(usersEnteredPassword.toCharArray()), 
      passwordField.getPassword()) {
      // password match!
}

余談: 上記のように、変数名の最初の文字として小文字を使用して、Java 命名規則に従います。命名規則を読む

于 2013-10-22T10:24:16.147 に答える