代码之家  ›  专栏  ›  技术社区  ›  akourt

嵌入式Servlet容器的Spring Boot 2编程配置

  •  1
  • akourt  · 技术社区  · 7 年前

    为此,我希望安装以下设置:

    • 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 boot版本上非常简单,但是由于某些原因,在进行新的更改时并不是那么容易。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Kris    6 年前

    我刚遇到同样的问题,在网上找不到解决办法。

    最后,我提出了以下强制创建AJP连接器的方法 只有 如果 server.tomcat.ajp.enabled 设置为true,否则将创建普通的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;
        }
    }