Spring 引导 - 替换默认的嵌入式 Tomcat 连接器
Spring Boot - replace default embedded Tomcat connector
我需要将 AJP 连接器添加到嵌入式 Tomcat 并禁用(或替换)侦听 8080 的默认连接器。
我尝试使用 EmbeddedServletContainerCustomizer 对此进行自定义,但我无法获得 Tomcat 对象的句柄来替换在那里创建的默认连接器。结果,除了我的 AJP 端口外,我还得到了 8080 上的 http 端口。
接下来,我尝试扩展 TomcatEmbeddedServletContainerFactory 并覆盖其 getTomcatEmbeddedServletContainer 方法。根据 JavaDoc,这似乎是替换默认连接器的完美位置,但它最终仍被启用(并且也没有创建我的 AJP 连接器)。任何想法我可能会错过什么?我已经用调试器验证了我的配置是 运行.
根据下面的回答,这是最干净的解决方案:
@Bean
public EmbeddedServletContainerFactory tomcat() {
TomcatEmbeddedServletContainerFactory myFactory = new TomcatEmbeddedServletContainerFactory();
myFactory.setProtocol("AJP/1.3");
myFactory.setPort(9000);
return myFactory;
}
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer2() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
tomcat.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
connector.setRedirectPort(9001);
}
});
}
};
}
您可以使用 TomcatConnectorCustomizer
通过将现有连接器添加到 TomcatEmbeddedServletContainerFactory
来配置现有连接器以使用 AJP。
只需创建一个 EmbeddedServletContainerCustomizer
bean 并将其重新配置为 AJP:
@Configuration
public class ServletConfig {
// AJP port defined in properties (default 666)
@Value("${tomcat.ajp.port:666}")
private Integer ajpPort;
@Bean
public EmbeddedServletContainerCustomizer ajpContainerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
tomcat.setProtocol("AJP/1.3");
tomcat.setPort(ajpPort);
}
};
}
}
我需要将 AJP 连接器添加到嵌入式 Tomcat 并禁用(或替换)侦听 8080 的默认连接器。
我尝试使用 EmbeddedServletContainerCustomizer 对此进行自定义,但我无法获得 Tomcat 对象的句柄来替换在那里创建的默认连接器。结果,除了我的 AJP 端口外,我还得到了 8080 上的 http 端口。
接下来,我尝试扩展 TomcatEmbeddedServletContainerFactory 并覆盖其 getTomcatEmbeddedServletContainer 方法。根据 JavaDoc,这似乎是替换默认连接器的完美位置,但它最终仍被启用(并且也没有创建我的 AJP 连接器)。任何想法我可能会错过什么?我已经用调试器验证了我的配置是 运行.
根据下面的回答,这是最干净的解决方案:
@Bean
public EmbeddedServletContainerFactory tomcat() {
TomcatEmbeddedServletContainerFactory myFactory = new TomcatEmbeddedServletContainerFactory();
myFactory.setProtocol("AJP/1.3");
myFactory.setPort(9000);
return myFactory;
}
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer2() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
tomcat.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
connector.setRedirectPort(9001);
}
});
}
};
}
您可以使用 TomcatConnectorCustomizer
通过将现有连接器添加到 TomcatEmbeddedServletContainerFactory
来配置现有连接器以使用 AJP。
只需创建一个 EmbeddedServletContainerCustomizer
bean 并将其重新配置为 AJP:
@Configuration
public class ServletConfig {
// AJP port defined in properties (default 666)
@Value("${tomcat.ajp.port:666}")
private Integer ajpPort;
@Bean
public EmbeddedServletContainerCustomizer ajpContainerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
tomcat.setProtocol("AJP/1.3");
tomcat.setPort(ajpPort);
}
};
}
}