如何在Spring-Shell中屏蔽输入字符串

时间:2019-06-04 11:16:23

标签: java spring-boot terminal spring-shell jansi

我正在使用Spring-Shell,我想在为特定方法输入密码字段时屏蔽输入。

在Internet上和论坛中的这里,我发现很多人建议使用 console.readPassword()命令,但是从IDE内部创建控制台会给我一个空的结果。 / p>

Scanner in= new Scanner(System.in)
-------------------------------OR------------------------------------
BufferedReader in = new BufferedReader(new InputStreamReader(System.in)

这些是我试图从用户那里获得输入的代码行,但是我找不到掩盖输入的方法,因此当有人键入密码时,它会显示在屏幕上。

环顾四周,我发现要使控制台命令起作用,我可以使用外部终端代替IDE,但是,当启动SpringBoot(一个Spring-Shell项目)时,我得到了Jline警告:

“无法创建系统终端,创建哑终端(启用调试日志以获取更多信息)”。

那么,有没有一种简单的方法可以使用scanner/BufferedReader类来掩盖密码,还是我需要使系统终端能够使用控制台?

谢谢

1 个答案:

答案 0 :(得分:1)

您可以使用JLine库中的org.jline.reader.LineReader,该库默认情况下是在Spring Shell应用程序中获得的。

下面是一些示例代码:

import org.jline.reader.LineReader;

public class InputReader {

private static final Character DEFAULT_MASK = '*';

private Character mask;
private LineReader lineReader;

public InputReader(LineReader lineReader) {
    this(lineReader, null);
}

public InputReader(LineReader lineReader, Character mask) {
    this.lineReader = lineReader;
    this.mask = mask != null ? mask : DEFAULT_MASK;
}

public String prompt(String  prompt) {
    return prompt(prompt, true);
}

public String prompt(String  prompt, boolean echo) {
    String answer;
    if (echo) {
        answer = lineReader.readLine(prompt + ": ");
    } else {
        answer = lineReader.readLine(prompt + ": ", mask);
    }
    return answer;
}

}

然后,使其成为一个豆:

@Bean
public InputReader inputReader(@Lazy LineReader lineReader) {
    return new InputReader(lineReader);
}

最后在您的应用中使用它:

@ShellComponent
public class YourShellComponent {

private final InputReader inputReader;

@Autowired
public YourShellComponent(InputReader inputReader) {
    this.inputReader = inputReader;
}

@ShellMethod(value = "connect")
public void connect() throws Exception {
    String username = this.inputReader.prompt("Username");
    String password = this.inputReader.prompt("Password", false);

    // other code
}
}