事实证明,有一种方法可以做到这一点,尽管我不确定我是否找到了“正确”的方法,因为这需要数小时从多个项目中读取源代码。换句话说,这可能是很多愚蠢的工作(但它确实有效)。
首先,无法获取嵌入式 Tomcat 中的 server.xml 来扩充或替换它。这必须以编程方式完成。
其次,“require_https”设置无济于事,因为您无法以这种方式设置证书信息。它确实设置了从 http 到 https 的转发,但它没有为您提供使 https 工作的方法,因此转发没有帮助。但是,将它与下面的东西一起使用,这确实使 https 工作。
首先,您需要按照Embedded Servlet Container Support docsEmbeddedServletContainerFactory
中的说明提供一个。这些文档适用于 Java,但 Groovy 看起来几乎相同。请注意,我无法让它识别他们示例中使用的注释,但不需要它。对于 groovy,只需将其放在一个新的 .groovy 文件中,并在启动引导时将该文件包含在命令行中。@Value
spring
现在,说明说您可以自定义TomcatEmbeddedServletContainerFactory
您在该代码中创建的类,以便您可以更改 web.xml 行为,这是真的,但对于我们的目的,重要的是要知道您也可以使用它来定制server.xml
行为。事实上,阅读该类的源代码并将其与 Embedded Tomcat 文档进行比较,您会发现这是唯一可以这样做的地方。有趣的函数是TomcatEmbeddedServletContainerFactory.addConnectorCustomizers()
,它可能看起来不像 Javadocs,但实际上为您提供了 Embedded Tomcat 对象来自定义您自己。只需传递您自己的实现并在函数TomcatConnectorCustomizer
中给定的内容上设置您想要的东西。现在,你可以用它做大约十亿件事情,但我找不到有用的文档,但是Connector
void customize(Connector con)
Connector
createConnector()
这个功能在这个家伙个人的 Spring-embedded-Tomcat 项目中是一个非常实用的指南。我的实现最终看起来像这样:
package com.deepdownstudios.server
import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory
import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.*
import org.springframework.stereotype.*
@Configuration
class MyConfiguration {
@Bean
public EmbeddedServletContainerFactory servletContainer() {
final int port = 8443;
final String keystoreFile = "/path/to/keystore"
final String keystorePass = "keystore-password"
final String keystoreType = "pkcs12"
final String keystoreProvider = "SunJSSE"
final String keystoreAlias = "tomcat"
TomcatEmbeddedServletContainerFactory factory =
new TomcatEmbeddedServletContainerFactory(this.port);
factory.addConnectorCustomizers( new TomcatConnectorCustomizer() {
void customize(Connector con) {
Http11NioProtocol proto = (Http11NioProtocol) con.getProtocolHandler();
proto.setSSLEnabled(true);
con.setScheme("https");
con.setSecure(true);
proto.setKeystoreFile(keystoreFile);
proto.setKeystorePass(keystorePass);
proto.setKeystoreType(keystoreType);
proto.setProperty("keystoreProvider", keystoreProvider);
proto.setKeyAlias(keystoreAlias);
}
});
return factory;
}
}
自动装配将选择这个实现并运行它。一旦我修复了我破坏的密钥库文件(确保你用 调用 keytool -storetype pkcs12
,而不是-storepass pkcs12
像其他地方报道的那样),这就奏效了。此外,提供参数(端口、密码等)作为测试的配置设置会更好......我相信如果您可以让@Value 注释与 Groovy 一起使用,这是可能的。