Во время ввода пароля от пользователя на консоли, отображать знак звездочки (*) вместо простого текста - PullRequest
0 голосов
/ 03 апреля 2020

Я попробовал следующие коды, оба имеют разные подходы.

Подход 1: Он прерывается при выполнении в последней версии Eclipse IDE, скажем 2020-03 , тогда как он работает штраф в Марс IDE.

Эта проблема уже задается на этом Как отобразить звездочку для ввода в Java? .

Подход 1:


Package test;

import java.io.*;

public class Test {
    public static void main(final String[] args) {
        String password = PasswordField.readPassword("Enter password:");
        System.out.println("Password entered was:" + password);
    }
}

class PasswordField {

    public static String readPassword(String prompt) {
        EraserThread et = new EraserThread(prompt);
        Thread mask = new Thread(et);
        mask.start();

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String password = "";

        try {
            password = in.readLine();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
        et.stopMasking();
        return password;
    }
}

class EraserThread implements Runnable {
    private boolean stop;

    public EraserThread(String prompt) {
        System.out.print(prompt);
    }

    @SuppressWarnings("static-access")
    public void run() {
        while (!stop) {
            System.out.print("\010*");

            try {
                Thread.sleep(1);
            } catch (InterruptedException ie) {
                ie.printStackTrace();
            }

        }
    }

    public void stopMasking() {
        this.stop = true;
    }
}

Подход 2:

Он не работает в Eclipse IDE, но работает в командной строке.


import java.io.Console;
public class Main {

    public void passwordExample() {        
        Console console = System.console();
        if (console == null) {
            System.out.println("Couldn't get Console instance");
            System.exit(0);
        }

        console.printf("Testing password%n");
        char[] passwordArray = console.readPassword("Enter your secret password: ");
        console.printf("Password entered was: %s%n", new String(passwordArray));

    }

    public static void main(String[] args) {
        new Main().passwordExample();
    }
}

1 Ответ

0 голосов
/ 03 апреля 2020

Ваша программа для подхода 1 не работает, поскольку кажется, что поток ластика не закрыт. Вы должны изменить ваше начальное логическое значение на stopMasking на false, а затем сказать, что установите его в true после перехвата. Есть ряд ресурсов, доступных с кодом, который делает именно так. Лучшее, что я нашел здесь:

http://www.cse.chalmers.se/edu/year/2018/course/TDA602/Eraserlab/pwdmasking.html

Это работает в моей сборке Eclipse 2020. Что касается вашего второго подхода, консоль не работает для ввода данных пользователем в среде IDE, поэтому проблемы там, но не из командной строки. Если вы хотите использовать эту версию, вы можете заменить консоль сканером:

 import java.util.Scanner

 Scanner input = new Scanner(System.in);
 String password = input.nextLine();
 //implementation

Я бы также предложил импортировать определенные файлы классов c, которые вам нужны. Импорт всего java .io приведет к сбою вашей программы. Надеюсь, это поможет!

...