1 简介

Spring WebFlux是一个新兴的技术,Spring团队把宝都压在响应式Reactive上了,于是推出了全新的Web实现。本文不讨论响应式编程,而是通过实例讲解Springboot WebFlux如何把http重定向到https

作为餐前小吃,建议大家先吃以下https小菜,以帮助理解:

(1)Springboot整合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获取更多精彩文章!

欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

多读书,多分享;多写作,多整理。

最新文章

  1. Windows共享作为公司文件服务器的案例
  2. PHP导出数据到CSV文件函数 csv_export()
  3. ORACLE设置id自增长
  4. 块状元素(div)与内联元素(span)
  5. git Could not read from remote repository 解决
  6. mysql规范
  7. appt查看apk信息
  8. Windows Server 2008 R2安装WAMPSERVER无法启动的解决方法
  9. Codeforces Codeforces Round #316 (Div. 2) C. Replacement set
  10. java网络编程之TCP实例
  11. Sublime Text 新建文件可选类型的模版插件: SublimeTmpl
  12. 漫游Kafka入门篇之简单介绍
  13. Memcached【第二篇】高可用集群搭建
  14. 信息摘要算法之三:SHA256算法分析与实现
  15. 跨站请求伪造和cookie伪造
  16. Linux运维面试题之--网页打开缓慢如何优化
  17. epoll源码分析
  18. 中小型研发团队架构实践六:如何用好消息队列RabbitMQ?
  19. hadoop Shell命令详解
  20. 用js写三个数,让三个数从小到大排列

热门文章

  1. Boyer-Moore字符串搜索(BM算法)的Python实现
  2. Python 0(安装及初步使用+学习资源推荐)
  3. MODIS系列之NDVI(MOD13Q1)二:modis数据相关信息
  4. 33.1 File 获取目录下的所有文件及子目录
  5. C语言实现顺序栈以及栈的特点
  6. Exchange 2016 OWA登陆异常
  7. 数据结构和算法(Golang实现)(17)常见数据结构-树
  8. 【做中学】第一个 Go 语言程序:漫画下载器
  9. Docker-None &amp; Host 网络
  10. ChaosBlade--动态脚本实现 Java 实验场景