首页 > 解决方案 > 我的 Spring Boot 应用程序能否仅在某些 @RequestMappings 上运行 HTTPS?

问题描述

我正在开发一个用于智能房屋的 Spring 应用程序。我得到了向 Spring 应用程序发送数据的微控制器,但由于空间和处理速度不足,我无法在它们上实现 SSL。

在客户端,我想使用 HTTPS,因为客户端在 Android 上运行。

我可以将某些请求映射到 HTTP 并将其他请求映射到 HTTPS 吗?

标签: springspring-bootsslhttps

解决方案


我们能不能从 Spring Boot 应用程序中打开两个端口,一个在 443 上,另一个在 80 上。这样,在 https 上它监听 443,在 http 上监听 80。所以在您的应用程序中,您可以在 url 上配置 http 以使用 80 端口和 https使用 443 端口。

我们可以通过更改 application.properties 来做到这一点:

#Https settings
server.port=443
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password = secret
server.ssl.key-password = secret
#Http setting
server.http.port=80

我正在举一个使用 Undertow 服务器的示例,您可以在任何应用程序服务器(tomcat 等)上执行此操作:

@SpringBootApplication
public class Boot {

    @Value("${server.http.port:0}")
    private Integer httpPort;

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Boot.class, args);
    }

    @Bean
    public UndertowEmbeddedServletContainerFactory embeddedServletContainerFactory() {
        UndertowEmbeddedServletContainerFactory factory = new UndertowEmbeddedServletContainerFactory();
        factory.addBuilderCustomizers(new UndertowBuilderCustomizer() {

            public void customize(Builder builder) {
                // worker options
                builder.setWorkerThreads(500);
                builder.setWorkerOption(Options.TCP_NODELAY, true);

                // io options
                builder.setIoThreads(Runtime.getRuntime().availableProcessors() * 2);

                // socket options
                builder.setSocketOption(Options.BACKLOG, 10000);
                builder.setSocketOption(Options.TCP_NODELAY, true);
                builder.setSocketOption(Options.REUSE_ADDRESSES, true);

                // server options
                builder.setServerOption(UndertowOptions.ALWAYS_SET_KEEP_ALIVE, false);
                builder.setServerOption(UndertowOptions.ALWAYS_SET_DATE, true);
                builder.setServerOption(UndertowOptions.RECORD_REQUEST_START_TIME, false);

                // Done to keep both http and https port open at production
                if (httpPort > 0)
                    builder.addHttpListener(httpPort, "0.0.0.0");
            }

        });
        return factory;
    }

}

推荐阅读