java - 如何在 Spring-Shell 中屏蔽输入字符串
问题描述
我正在使用 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
类来屏蔽密码,或者我是否需要启用系统终端才能使用控制台?
谢谢
解决方案
您可以使用 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:
@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
}
}
推荐阅读
- c++17 - clang 6.0.0 版:clang++“命名空间‘std’中没有名为‘make_optional’的成员”
- scala - 是否有相当于 python 目录的 Scala?
- c# - Unity 自动隐藏面板
- docker - 在 Visual Studio 中禁用 Docker
- reactjs - 我可以将函数作为道具传递并让它修改子组件中的其他道具吗?
- python - 如何用熊猫绘制垂直区域图
- reactjs - React Component:重新分配道具值
- java - 为什么 setImage() 不会改变我在 JavaFx 中的 ImgView?
- tensorflow - 使用data.make_csv_dataset时如何沿特征列展平张量流数据集?
- swift - 如何将@NSManaged 对象类中的变量初始化为 JSON 值?