首页 > 解决方案 > Spring Webflux:调用API Http重定向到Https时Webclient接收数据为null

问题描述

我为 spring 5 配置了 Https 服务器 Netty:

@Component
public class NettyWebServerFactorySslCustomizer implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {

    @Override
    public void customize(NettyReactiveWebServerFactory serverFactory) {
        Ssl ssl = new Ssl();
        ssl.setEnabled(true);
        ssl.setKeyStore("classpath:sample.jks");
        ssl.setKeyAlias("alias");
        ssl.setKeyPassword("password");
        ssl.setKeyStorePassword("password");
        Http2 http2 = new Http2();
        http2.setEnabled(false);
        serverFactory.addServerCustomizers(new SslServerCustomizer(ssl, http2, null));
        serverFactory.setPort(8888);
    }
}

将 http 重定向到 https:

@Configuration
public class HttpToHttpsRedirectConfig {

    @PostConstruct
    public void startRedirectServer() {
        NettyReactiveWebServerFactory httpNettyReactiveWebServerFactory = new NettyReactiveWebServerFactory(8080);
        httpNettyReactiveWebServerFactory.getWebServer((request, response) -> {
            URI uri = request.getURI();
            URI httpsUri;
            try {
                httpsUri = new URI("https", uri.getUserInfo(), uri.getHost(), 8888, uri.getPath(), uri.getQuery(), uri.getFragment());
            } catch (URISyntaxException e) {
                return Mono.error(e);
            }
            response.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
            response.getHeaders().setLocation(httpsUri);
            return response.setComplete();
        }).start();
    }

}

当我尝试使用浏览器访问 api 时:

https://localhost:8888/api -> 接收数据

http://localhost:8080/api -> 重定向:https://localhost:8888/api -> 接收数据

但我使用 Webclient:

@Bean
public Webclient getWebclient() {
    try {  
        KeyStore ks = KeyStore.getInstance("JKS");
        try (InputStream is = getClass().getResourceAsStream("/sample.jks")) {
            ks.load(is, "password".toCharArray());
        }

        X509Certificate[] trusted = Collections.list(ks.aliases()).stream().map(alias -> {
            try {
                return (X509Certificate) ks.getCertificate(alias);
            } catch (KeyStoreException e) {
                throw new RuntimeException(e);
            }
        }).toArray(X509Certificate[]::new);

        SslContext sslContext = SslContextBuilder.forClient().trustManager(trusted).build();
        HttpClient httpClient = httpclient.create().secure(t -> t.sslContext(sslContext));
        return WebClient.builder().clientConnector(new ReactorClientHttpConnector(httpClient));
    } catch (Exception e) {
        e.prinStackTrace();
        return null;
    }
}

当我调用 Api 时:

https://localhost:8888/api -> 接收数据

http://localhost:8080/api -> 空

你能帮助我吗?

标签: javaspringhttpswebclientspring-webflux

解决方案


推荐阅读