我试图配置Spring Boot 2提供的嵌入式Tomcat,我的主要目标是基于各种部署模型拥有多个连接器。
为此,我希望有以下设置:
到目前为止,关于第二种情况,我认为我已经能够配置到位,我创建了以下配置类:
@Configuration
public class EmbeddedWebServerConfiguration {
@Value("${server.port}")
private int httpPort;
@Value("${server.secure.port}")
private int httpsPort;
@Value("${server.uses.ssl}")
private boolean usesSSL;
@Value("${server.uses.ajp}")
private boolean usesAjp;
@Value("${server.ajp.port}")
private int ajpPort;
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection securityCollection = new SecurityCollection();
securityCollection.addPattern("/*");
securityConstraint.addCollection(securityCollection);
context.addConstraint(securityConstraint);
}
};
if (usesSSL) {
tomcat.addAdditionalTomcatConnectors(redirectConnector());
}
if (usesAjp) {
tomcat.addAdditionalTomcatConnectors(ajpConnector());
}
return tomcat;
}
private Connector redirectConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(httpPort);
connector.setSecure(false);
connector.setRedirectPort(httpsPort);
return connector;
}
private Connector ajpConnector() {
Connector connector = new Connector("AJP/1.3");
connector.setScheme("http");
connector.setPort(ajpPort);
connector.setSecure(false);
return connector;
}
}
基于以上所述,我有以下问题:
有没有办法让Spring省略它的默认连接器的创建?我试过环顾他们的文档,但我没有找到任何有用的东西。由于我正在启动一个AJP连接器(作为附加的连接器添加),我不希望默认的HTTP连接器到位。
此外,当我尝试创建重定向连接器来处理HTTPS请求时,我的应用程序由于相同的端口绑定而无法启动(默认连接器在与重定向端口相同的端口上侦听)。
这个设置很容易在2.0之前的Spring启动版本上完成,但由于某些原因,新的更改并不容易。
有没有人对如何做到这一点有任何解决方案?我希望能够进行全面控制并以编程方式配置任何内容。
答案 0 :(得分:1)
我只是遇到了同样的问题,无法在线找到解决方案。
最终,我提出以下建议,如果server.tomcat.ajp.enabled
设置为true,则强制创建AJP连接器 ,否则将创建普通的http连接器。
@SpringBootApplication
public class MyApplication {
@Value("${server.tomcat.ajp.port}")
int ajpPort;
@Value("${server.tomcat.ajp.enabled}")
boolean tomcatAjpEnabled;
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
if (tomcatAjpEnabled) {
log.info("AJP Enabled on port {}", ajpPort);
factory.setProtocol("AJP/1.3");
factory.addConnectorCustomizers(connector -> {
connector.setPort(ajpPort);
});
} // else create default http connector as per usual
return factory;
}
}