springboot重定向到页面_Springboot-WebFlux实现http重定向到https

1 简介

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

springboot重定向到页面_Springboot-WebFlux实现http重定向到https_第1张图片

作为餐前小吃,建议大家先吃以下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 总结

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

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

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

你可能感兴趣的:(springboot重定向到页面_Springboot-WebFlux实现http重定向到https)