Springboot-WebFlux实现http重定向到https
2024-10-09 00:33:11
1 简介
Spring WebFlux
是一个新兴的技术,Spring
团队把宝都压在响应式Reactive
上了,于是推出了全新的Web
实现。本文不讨论响应式编程,而是通过实例讲解Springboot WebFlux
如何把http
重定向到https
。
作为餐前小吃,建议大家先吃以下https
小菜,以帮助理解:
(2)HTTPS之密钥知识与密钥工具Keytool和Keystore-Explorer
(3)Springboot以Tomcat为容器实现http重定向到https的两种方式
(4)Springboot以Jetty为容器实现http重定向到https
(5)nginx开启ssl并把http重定向到https的两种方式
2 搭建WebFlux项目
引入WebFlux
的依赖如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
实现Controller
,与之前略有不同,返回值为Mono<T>
:
@RestController
public class HelloController {
@GetMapping("/hello")
public Mono<String> hello() {
return Mono.just("Welcome to www.pkslow.com");
}
}
配置文件与普通的Springboot
项目没什么差别,配置了两个端口,并配置SSL
相关参数:
server.port=443
http.port=80
server.ssl.enabled=true
server.ssl.key-store-type=jks
server.ssl.key-store=classpath:localhost.jks
server.ssl.key-store-password=changeit
server.ssl.key-alias=localhost
3 重定向实现
主要做了两件事:
(1)在有https
的情况下,启动另一个http
服务,主要通过NettyReactiveWebServerFactory
来生成一个Web
服务。
(2)把http
重定向到https
,这里做了路径判断,加了一个简单的过滤函数。通过提供一个新的HttpHandler
来实现重定向。
package com.pkslow.ssl.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.HttpHandler;
import reactor.core.publisher.Mono;
import javax.annotation.PostConstruct;
import java.net.URI;
import java.net.URISyntaxException;
@Configuration
public class HttpToHttpsConfig {
@Value("${server.port}")
private int httpsPort;
@Value("${http.port}")
private int httpPort;
@Autowired
private HttpHandler httpHandler;
@PostConstruct
public void startRedirectServer() {
NettyReactiveWebServerFactory factory = new NettyReactiveWebServerFactory(httpPort);
factory.getWebServer(
(request, response) -> {
URI uri = request.getURI();
URI httpsUri;
try {
if (isNeedRedirect(uri.getPath())) {
httpsUri = new URI("https",
uri.getUserInfo(),
uri.getHost(),
httpsPort,
uri.getPath(),
uri.getQuery(),
uri.getFragment());
response.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
response.getHeaders().setLocation(httpsUri);
return response.setComplete();
} else {
return httpHandler.handle(request, response);
}
} catch (URISyntaxException e) {
return Mono.error(e);
}
}
).start();
}
private boolean isNeedRedirect(String path) {
return !path.startsWith("/actuator");
}
}
4 总结
本文详细代码可在南瓜慢说公众号回复<SpringbootSSLRedirectWebFlux>获取。
欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章!
欢迎关注微信公众号<南瓜慢说>,将持续为你更新...
多读书,多分享;多写作,多整理。
最新文章
- Windows共享作为公司文件服务器的案例
- PHP导出数据到CSV文件函数 csv_export()
- ORACLE设置id自增长
- 块状元素(div)与内联元素(span)
- git Could not read from remote repository 解决
- mysql规范
- appt查看apk信息
- Windows Server 2008 R2安装WAMPSERVER无法启动的解决方法
- Codeforces Codeforces Round #316 (Div. 2) C. Replacement set
- java网络编程之TCP实例
- Sublime Text 新建文件可选类型的模版插件: SublimeTmpl
- 漫游Kafka入门篇之简单介绍
- Memcached【第二篇】高可用集群搭建
- 信息摘要算法之三:SHA256算法分析与实现
- 跨站请求伪造和cookie伪造
- Linux运维面试题之--网页打开缓慢如何优化
- epoll源码分析
- 中小型研发团队架构实践六:如何用好消息队列RabbitMQ?
- hadoop Shell命令详解
- 用js写三个数,让三个数从小到大排列
热门文章
- Boyer-Moore字符串搜索(BM算法)的Python实现
- Python 0(安装及初步使用+学习资源推荐)
- MODIS系列之NDVI(MOD13Q1)二:modis数据相关信息
- 33.1 File 获取目录下的所有文件及子目录
- C语言实现顺序栈以及栈的特点
- Exchange 2016 OWA登陆异常
- 数据结构和算法(Golang实现)(17)常见数据结构-树
- 【做中学】第一个 Go 语言程序:漫画下载器
- Docker-None &; Host 网络
- ChaosBlade--动态脚本实现 Java 实验场景