Spring Boot - 替换默认的嵌入式Tomcat连接器

时间:2015-01-20 16:25:50

标签: spring-boot

我需要在嵌入式Tomcat中添加一个AJP连接器,并禁用(或替换)侦听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);
                }
            });
        }
    };
} 

2 个答案:

答案 0 :(得分:4)

您可以使用TomcatConnectorCustomizer将现有连接器配置为使用AJP,方法是将其添加到TomcatEmbeddedServletContainerFactory

答案 1 :(得分:1)

只需创建一个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);
            }

        };
    }

}