以编程方式 refresh/restart 当前 Tomcat 实例

Programmatically refresh/restart current Tomcat instance

在密钥库中添加生成的 SSL 证书后,我需要 refresh/restart Tomcat。我正在使用 Java REST 调用来添加证书。

store.setKeyEntry("tomcat", keyPair.getPrivate(),
                    "password".toCharArray(), certs);

Refresh/restart 应该发生在同一个 REST 调用中。

我怎样才能做到这一点?

这是一个高级别的安全问题!你不能/不应该用 REST 调用重启你的服务器!这将为您的客户提供一种非常简单的方法来在您的数据中心生成 DOS 拒绝服务攻击,可能会限制其他服务!

如果您需要管理与您的资产相关的较低级别的软件/硬件服务,那么您不应使用您的应用程序级别的服务和协议,但您应该实施作为您的安全基础设施一部分的低级别管理协议!

为了更具体地说明你的情况,我会使用虚拟环境,例如VMWare 和相关协议以及动态设置/重置凭据和启动/重启服务器的调用! VMWare 虚拟服务很有可能还有一些具有 REST 服务的上层应用程序,您仍然可以从客户端使用(在 SSL 握手和所有相关安全句柄之后)调用 HTTP REST 来启动这些服务!

我同意 Gabor 关于安全漏洞的看法。我不知道你的用例,但如果你真的需要实现它,那么你需要创建一个简单的 tomcat 重启脚本并在添加证书后执行它。 解决方法如下post:how to restart tomcat from a running webapp?

我建议您使用 Apache Commons Exec

希望对您有所帮助。

我现在可以重新启动了。我使用批处理文件重新启动服务器。但是重启后,如果我再次尝试任何 REST 调用,它就会被挂起。它将在 10-15 分钟后工作。代码片段

public无效运行(){

    try {
        Thread.sleep(3000); // wait for response return
        String path = SERVER_RESTART_SCRIPT;
        Runtime rn = Runtime.getRuntime();
        Process proc = rn.exec(path);
        proc.waitFor();
        System.exit(0);
    } catch (IOException e) {
        logger.error("IO exception: " + e);
    } catch (InterruptedException e) {
        logger.error("InterruptedException: " + e);
    }

}