10

Springboot-WebFlux实现http重定向到https

 4 years ago
source link: https://segmentfault.com/a/1190000022538482
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

1 简介

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

IrIz6r2.png!web

作为餐前小吃,建议大家先吃以下 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 获取更多精彩文章!

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

rem6VnY.jpg!web

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK