Springboot:根据一些标志初始化 EmbeddedServletContainerFactory
Springboot : Initializing EmbeddedServletContainerFactory based on some flag
我想在 spring 引导应用程序中实现 SSL,其中,我还想加密(出于测试目的,我通过 base 64 对其进行编码)密钥库的密码,我将其作为 JVM 参数传递到 spring 启动应用程序。
此密钥库密码稍后将用于解密(目前为 base 64 解码)并动态形成 EmbeddedServletContainerFactory。
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();
tomcatFactory.setSsl(createSsl());
tomcatFactory.setPort(sslConfig.getHttpsPort());
return tomcatFactory;
}
private Ssl createSsl() {
Ssl ssl = new Ssl();
try {
ssl.setKeyStore("/path/to/keystore.pkcs12");
ssl.setKeyStorePassword(new String(Base64.getDecoder().decode(sslConfig.getKeyPassword())));
ssl.setKeyAlias(sslConfig.getKeyAlias());
} catch (Exception e) {
logger.error(e.getMessage());
}
return ssl;
}
JVM 参数:
-Dtls.keyAlias=tomcat
-Dtls.key-store-password=cGFzc3dvcmQ=
POJO 用于存储从 JVM 参数获取的别名和密码:
@Component
public class SSLConfig {
@Value("#{systemProperties['tls.keyAlias']}")
public String keyAlias;
@Value("#{systemProperties['tls.key-store-password']}")
private String keyPassword;
....getters n setters
}
以上配置绝对没问题。
现在,我想基于一些将通过 JVM 参数传递的标志来实现这一点,比如 "isSSLEnabled",设置控件应该流经上述逻辑,否则它应该以默认方式工作。
有人可以指导一下吗?
您可以使用 Spring Boot 的 ConditionalOnProperty 注释使您的 servletContainer()
bean 以 isSSLEnabled
property/JVM 参数的值为条件。
例如:
@Bean
@ConditionalOnProperty(name = "isSSLEnabled", havingValue = "true")
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();
tomcatFactory.setSsl(createSsl());
tomcatFactory.setPort(sslConfig.getHttpsPort());
return tomcatFactory;
}
private Ssl createSsl() {
Ssl ssl = new Ssl();
try {
ssl.setKeyStore("/path/to/keystore.pkcs12");
ssl.setKeyStorePassword(new String(Base64.getDecoder().decode(sslConfig.getKeyPassword())));
ssl.setKeyAlias(sslConfig.getKeyAlias());
} catch (Exception e) {
logger.error(e.getMessage());
}
return ssl;
}
我想在 spring 引导应用程序中实现 SSL,其中,我还想加密(出于测试目的,我通过 base 64 对其进行编码)密钥库的密码,我将其作为 JVM 参数传递到 spring 启动应用程序。
此密钥库密码稍后将用于解密(目前为 base 64 解码)并动态形成 EmbeddedServletContainerFactory。
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();
tomcatFactory.setSsl(createSsl());
tomcatFactory.setPort(sslConfig.getHttpsPort());
return tomcatFactory;
}
private Ssl createSsl() {
Ssl ssl = new Ssl();
try {
ssl.setKeyStore("/path/to/keystore.pkcs12");
ssl.setKeyStorePassword(new String(Base64.getDecoder().decode(sslConfig.getKeyPassword())));
ssl.setKeyAlias(sslConfig.getKeyAlias());
} catch (Exception e) {
logger.error(e.getMessage());
}
return ssl;
}
JVM 参数:
-Dtls.keyAlias=tomcat
-Dtls.key-store-password=cGFzc3dvcmQ=
POJO 用于存储从 JVM 参数获取的别名和密码:
@Component
public class SSLConfig {
@Value("#{systemProperties['tls.keyAlias']}")
public String keyAlias;
@Value("#{systemProperties['tls.key-store-password']}")
private String keyPassword;
....getters n setters
}
以上配置绝对没问题。
现在,我想基于一些将通过 JVM 参数传递的标志来实现这一点,比如 "isSSLEnabled",设置控件应该流经上述逻辑,否则它应该以默认方式工作。
有人可以指导一下吗?
您可以使用 Spring Boot 的 ConditionalOnProperty 注释使您的 servletContainer()
bean 以 isSSLEnabled
property/JVM 参数的值为条件。
例如:
@Bean
@ConditionalOnProperty(name = "isSSLEnabled", havingValue = "true")
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();
tomcatFactory.setSsl(createSsl());
tomcatFactory.setPort(sslConfig.getHttpsPort());
return tomcatFactory;
}
private Ssl createSsl() {
Ssl ssl = new Ssl();
try {
ssl.setKeyStore("/path/to/keystore.pkcs12");
ssl.setKeyStorePassword(new String(Base64.getDecoder().decode(sslConfig.getKeyPassword())));
ssl.setKeyAlias(sslConfig.getKeyAlias());
} catch (Exception e) {
logger.error(e.getMessage());
}
return ssl;
}