Spring Boot动态获取运行端口用于OAuth2实现的问题
问题:OAuth2初始化前动态获取应用运行端口失败
我需要在OAuth2执行前动态获取应用运行端口,否则OAuth2无法正常连接。当前应用配置server.port=8000,启动日志显示Tomcat初始化端口为8000,但遇到两个问题:
- 实现
WebServerFactoryCustomizer的CustomContainer类执行时机在OAuth2之前,但获取到的端口是8080(错误); - 实现
ApplicationListener<ServletWebServerInitializedEvent>并添加@Order(Ordered.HIGHEST_PRECEDENCE)注解的PortDomain类能获取正确的8000端口,但该类执行时机仍晚于OAuth2,导致OAuth2连接失败。
启动日志
2023-01-12 17:14:31.767 INFO 2492 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8000 (http) 2023-01-12 17:14:31.777 INFO 2492 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2023-01-12 17:14:31.777 INFO 2492 --- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.68] System 8080
CustomContainer类代码
@Component public class CustomContainer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> { @Override public void customize(TomcatServletWebServerFactory factory) { System.out.println("System " +factory.getWebServer().getPort()); } }
application.properties配置
server.port=8000
PortDomain类代码
@Component @Order(Ordered.HIGHEST_PRECEDENCE) @Slf4j public class PortDomain implements ApplicationListener<ServletWebServerInitializedEvent> { private static Integer port; private String domain = InetAddress.getLoopbackAddress().getHostName(); @Override public void onApplicationEvent(ServletWebServerInitializedEvent event) { setPort(event.getWebServer().getPort()); System.out.println("Check way "+event.getWebServer().getPort()); } public static void setPort(Integer port) { PortDomain.port = port; } public String portDomain(){ String protocolDomain = "http://"+domain+":"+port; log.info("UrlUtility protocolDomain{}",protocolDomain); return protocolDomain; } }
内容的提问来源于stack exchange,提问作者Sard
相关产品推荐
相关产品推荐

