事實證明,有一種方法可以做到這一點,雖然我不知道我找到了「正確」的方法,因爲這需要幾個小時的閱讀來自多個項目的源代碼。換句話說,這可能是很多愚蠢的工作(但它的工作原理)。
首先,無法獲取嵌入式Tomcat中的server.xml,無論是擴充還是替換它。這必須以編程方式完成。
其次,'require_https'設置沒有幫助,因爲您無法以這種方式設置證書信息。它確實設置從http轉發到https,但它沒有給你一個方法使https工作,因此轉發沒有什麼幫助。但是,使用它與下面的東西,其中做使https工作。
首先,您需要提供EmbeddedServletContainerFactory
,如Embedded Servlet Container Support docs中所述。該文檔適用於Java,但Groovy看起來幾乎相同。請注意,我無法識別其示例中使用的@Value
註釋,但不需要它。對於groovy,只需將其放在一個新的.groovy文件中,並在啓動spring
引導時將該文件包含在命令行中。
現在,說明聲明您可以自定義在該代碼中創建的TomcatEmbeddedServletContainerFactory
類,以便您可以改變web.xml的行爲,這是真的,但對於我們的目的而言,知道您也可以使用它來定製server.xml
行爲。事實上,閱讀該課程的源代碼並將其與Embedded Tomcat文檔進行比較,您會發現這是唯一能做到這一點的地方。有趣的功能是TomcatEmbeddedServletContainerFactory.addConnectorCustomizers()
,它可能不像Javadocs那麼多,但實際上爲您提供了嵌入式Tomcat對象來自定義自己。只需傳遞您自己的TomcatConnectorCustomizer
實現,並在函數中將給定Connector
上的所需內容設置爲void customize(Connector con)
函數。現在,您可以使用Connector
執行大約10億次的操作,但我找不到有用的文檔,但this guys personal Spring-embedded-Tomcat project中的createConnector()
函數是非常實用的指南。我的實現最終看起來是這樣的:
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;
}
}
自動裝配將選擇這個實現與它一起運行。一旦我修復了我的破解密鑰庫文件(確保你使用-storetype pkcs12
而不是-storepass pkcs12
調用keytool,如其他地方報告),這工作。另外,將參數(端口,密碼等)作爲測試配置設置等等會更好。如果您可以使用@Value註釋來與Groovy一起工作,我相信它是可能的。
我發現,使用不同的'application.properties'設置,'server.tomcat.basedir',這讓我覺得作爲另一個例子更可能與嵌入式Tomcat配置有關。我無法做任何事情,但它可能更接近正確的方向,並可能使我的問題更清晰。 – Dave
沒有運氣的命令行環境變量: '-Djavax.net.ssl.keyStore =/path/to/keystore'' -Djavax.net.ssl.keyStorePassword = keyStorePass' 要麼。 – Dave