使用tomcat在spring boot上读取控制台输入

Posted

技术标签:

【中文标题】使用tomcat在spring boot上读取控制台输入【英文标题】:Read Console input on spring boot with tomcat 【发布时间】:2017-09-05 01:13:24 【问题描述】:

是否可以在 spring boot 上的嵌入式 tomcat 启动之前读取控制台输入?所谓的应用程序流程是,向用户请求用户名和密码,这将用于启动应用程序。它在使用java -jar 命令时有效,问题是当我关闭控制台(Linux 上的 SSH)时进程停止。我尝试搜索它并发现该进程与控制台相关联,所以我尝试使用nohup,问题是我在使用时无法请求控制台输入。有没有其他办法?

【问题讨论】:

你能显示应用程序启动的命令吗?以及用户如何从命令行输入他的数据。 您想在应用程序启动前还是运行时阅读? 应该在应用程序启动之前。 【参考方案1】:

如果您想使用控制台输入(如 logger + System.out.println() 输出)来完整记录日志,那么您必须使用

nohup java -jar yourJarFile.jar admin password >> fullLogOutput.log &

另一个问题:

问题是当我关闭控制台(Linux 上的 SSH)进程时 停下来。

所以你想将你的 jar 文件作为后台进程运行。您无法通过关闭控制台来阻止它。只需在完整命令后添加 & 符号,它不会停止。您可以使用以下命令。

nohup java -jar yourJarFile.jar &

使用控制台输出获取完整日志

nohup java -jar yourJarFile.jar >> fullLogOutput.log &

&符号用于在后台运行程序。

nohup 实用程序使作为参数传递的命令在后台运行,即使在您注销后也是如此。

停止/杀死后端进程:

要停止后台进程,使用ps -aux获取id然后kill(id号)

ps -aux | grep yourJarFile.jar

你会得到身份证号码。杀死那个

sudo kill -9 <pid>

资源链接: https://***.com/a/12108646/2293534

【讨论】:

【参考方案2】:

在执行您的 java 程序之前在 shell 脚本中获取用户名和密码,并将它们作为参数传递给您的应用程序。

#!/bin/bash
# Ask login details
read -p 'user: ' uservar
read -sp 'password: ' passvar
echo

现在您有了用户名和密码,您可以使用 nohup 运行 java 命令并将用户密码作为 jvm 属性传递。您还可以按照其他答案中的建议将用户名和密码作为程序参数传递。

点赞nohup java -jar abc.jar -Duser=$user -Dpassword=$password

并使用

获取这些属性
 String user = System.getProperty("String");
 String password = System.getProperty("password");

【讨论】:

【参考方案3】:

您可以使用 nohup 启动带有参数的 jar,它们只是不会在终端的新行中​​提示它们。用户可以在启动 jar 时将它们作为参数添加。请参阅下面的详细信息。

例子:

主类

public static void main(String[] args) 
        String username = args[0];
        String password = args[1];
        if(username.equals("admin") && password.equals("password")) 
            SpringApplication.run(NohupApplication.class, args);
         else 
            System.out.println("You are not authorized to start this application.");
        
    

使用无效凭据

命令

nohup java -jar example.jar user password

nohup.out

You are not authorized to start this application.

具有有效凭据

命令

nohup java -jar example.jar admin password

nohup.out

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.2.RELEASE)

【讨论】:

【参考方案4】:

我认为这可以帮助你。

public static void main(String[] args) 

    Scanner scanner = new Scanner(System.in);

    //  prompt for the user's name
    System.out.print("Enter your name: ");

    // get their input as a String
    String username = scanner.next();

    System.out.println(username);

    SpringApplication.run(Application.class, args);

【讨论】:

你不应该也关闭扫描仪吗? @ImpulseTheFox 通常经验法则是始终关闭扫描仪。对于System.in,情况略有不同。如果您关闭System.in,您将无法在应用程序的生命周期内再次使用它。因此,如果您多次需要它,请将其保持打开状态。不过,这适用于System.in。您仍然需要关闭其他所有内容。

以上是关于使用tomcat在spring boot上读取控制台输入的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat 不读取 Spring-Boot 应用程序属性

在 Tomcat 上使用 Spring Boot 进行身份验证

Spring Boot上传文件+部署到Tomcat

Spring Boot 如何控制 Tomcat 缓存?

Spring Boot中的日志配置

spring boot 2 内嵌Tomcat Stopping service [Tomcat]