嵌入式Servlet容器

时间:2018-06-02 13:28:40

标签: java spring spring-boot

我试图配置Spring Boot 2提供的嵌入式Tomcat,我的主要目标是基于各种部署模型拥有多个连接器。

为此,我希望有以下设置:

  • HTTP连接器重定向到一个案例的HTTPS连接
  • 处理来自前端Apache服务器的请求的AJP连接器。

到目前为止,关于第二种情况,我认为我已经能够配置到位,我创建了以下配置类:

@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启动版本上完成,但由于某些原因,新的更改并不容易。

有没有人对如何做到这一点有任何解决方案?我希望能够进行全面控制并以编程方式配置任何内容。

1 个答案:

答案 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;
    }
}