java 重定向 https_Springboot-WebFlux实现http重定向到https

本文介绍了如何使用Springboot WebFlux将HTTP请求重定向到HTTPS。通过配置NettyReactiveWebServerFactory启动一个HTTP服务,并在路径判断的基础上,创建HttpHandler以实现重定向。详细代码可在指定渠道获取。
摘要由CSDN通过智能技术生成

1 简介

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

4e424ce836334cae95fdeec4c85e6a8b.png

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

2 搭建WebFlux项目

引入WebFlux的依赖如下:

org.springframework.boot

spring-boot-starter-webflux

实现Controller,与之前略有不同,返回值为Mono:

@RestController

public class HelloController {

@GetMapping("/hello")

public Mono 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 总结

本文详细代码可在南瓜慢说公众号回复获取。

欢迎关注微信公众号,将持续为你更新...

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值