java - 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 -> 空
你能帮助我吗?
解决方案
推荐阅读
- java - 无法在控制器中同时添加两个功能
- java - Apache spark和scala,执行查询时出错
- php - 使用 Codeigniter 成功验证时重定向警报
- sqlalchemy - 什么是基于查询过滤器返回对象(代表数据库中的一行)的 SQLAlchemy (ORM) 命令?
- r - do.call 和 rbind 用于列表,顺序为新列名
- oracle - 排除主页的授权 - Oracle Apex
- python - 如何从我的 Python 列表中选择其他选项
- java - JUnit 5 - 新注解 - 使用 JDB 进行调试
- python-3.x - 为什么 filter + abs 函数没有给出正确的值
- java - 我如何在后台关闭我的 android 应用程序的所有活动