当前位置: 移动技术网 > IT编程>开发语言>Java > Springboot-WebFlux实现http重定向到https

Springboot-WebFlux实现http重定向到https

2020年05月04日  | 移动技术网IT编程  | 我要评论

王茜华微博,草榴9月,一元爱购

1 简介

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

spring mvc and webflux venn

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


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

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

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网