Springboot-WebFlux實現http重定向到https


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)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>獲取。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM