spring - 我的 Spring Boot 应用程序能否仅在某些 @RequestMappings 上运行 HTTPS?
问题描述
我正在开发一个用于智能房屋的 Spring 应用程序。我得到了向 Spring 应用程序发送数据的微控制器,但由于空间和处理速度不足,我无法在它们上实现 SSL。
在客户端,我想使用 HTTPS,因为客户端在 Android 上运行。
我可以将某些请求映射到 HTTP 并将其他请求映射到 HTTPS 吗?
解决方案
我们能不能从 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;
}
}
推荐阅读
- flutter - Flutter:SystemChrome.setEnabledSystemUIOverlays 值何时会覆盖后续的屏幕覆盖值
- php - ajax like 按钮成功不正确
- c# - jQuery数据表在foreach循环加载数据时抛出错误
- security - HWID 保护和克隆
- javascript - ForEach 循环 PHP 中的倒数计时器
- python - 为什么 spaCy 依赖符号定义“case”和“compound”不能像 spacy.symbols 包中的“nsubj”一样被识别?
- javascript - Dropzone 实例适用于第一个元素,但不适用于克隆的元素 (Vue)
- excel - Excel VBA自动查找数字的上限和下限
- java - 接口如何为同一方法实现两种不同的算法
- python - 我如何提取(.find())没有类的div(或span)