我的Spring Boot应用程序可以仅在某些@RequestMappings上运行HTTPS吗?

时间:2018-05-30 20:38:59

标签: spring spring-boot ssl https

我正在开发一个Spring应用程序,如果用于智能家居。我得到了将数据发送到Spring应用程序的微控制器,但由于空间和处理速度不够,我无法对它们实施SSL。

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

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

1 个答案:

答案 0 :(得分:0)

我们不能从弹簧启动应用程序中打开两个端口,其中一个是443,另一个是80.这样,在https上它会监听443,而在http到80.所以在您的应用程序中,您可以在网址上配置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;
    }

}