【问题标题】:How to mask an input string in Spring-Shell如何在 Spring-Shell 中屏蔽输入字符串
【发布时间】:2019-06-04 11:16:23
【问题描述】:

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

查看互联网和论坛,我发现很多人建议使用 console.readPassword() 命令,但是从 IDE 内部创建控制台会导致结果为空。

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

这些是我试图从用户那里获取输入的代码行,但我找不到屏蔽输入的方法,所以当有人输入密码时它会显示在屏幕上。

环顾四周,我发现要使控制台命令正常工作,我可以使用外部终端而不是 IDE,但是在启动 SpringBoot(一个 Spring-Shell 项目)时,我收到了 Jline 警告:

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

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

谢谢

【问题讨论】:

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


    【解决方案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
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 2019-11-20
      • 1970-01-01
      相关资源
      最近更新 更多