欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Springboot-WebFlux实现http重定向到https

程序员文章站 2022-08-01 15:45:30
1 简介 是一个新兴的技术, 团队把宝都压在响应式 上了,于是推出了全新的 实现。本文不讨论响应式编程,而是通过实例讲解 如何把 重定向到 。 作为餐前小吃,建议大家先吃以下 小菜,以帮助理解: (1) "Springboot整合https原来这么简单" (2) "HTTPS之密钥知识与密钥工具Ke ......

1 简介

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

Springboot-WebFlux实现http重定向到https

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

(1)springboot整合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>获取。


欢迎访问获取更多精彩文章!

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

Springboot-WebFlux实现http重定向到https

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