Springboot-WebFlux实现http重定向到https
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)
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>获取。
欢迎访问获取更多精彩文章!
欢迎关注微信公众号<南瓜慢说>,将持续为你更新...
多读书,多分享;多写作,多整理。
上一篇: 标题在推广中的作用,如何书写吸引人的标题
下一篇: 出身贫寒的西晋名将,揭秘苟晞传奇的一生
推荐阅读