Java Web应用如何获取其运行所在服务器的端口号
你目前用InetAddress的实现只能获取服务器的IP和主机名,无法直接拿到Web容器的监听端口,因为端口是Web服务启动时由容器(Tomcat、Jetty等)绑定的,需要根据你的应用场景选择对应的实现方式:
场景1:Servlet 标准容器环境(可拿到HttpServletRequest对象)
直接通过请求对象自带方法即可获取端口,注意两个端口的区别:
getLocalPort():Web容器实际绑定监听的端口getServerPort():用户请求URL中携带的端口(存在反向代理场景时和实际监听端口可能不同)
示例代码:
import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; public void getServerInfo(HttpServletRequest request) throws Exception { // 原有获取IP、主机名逻辑 InetAddress ip = InetAddress.getLocalHost(); String hostname = ip.getHostName(); String serverIp = ip.getHostAddress(); // 获取端口 int realListenPort = request.getLocalPort(); int userRequestPort = request.getServerPort(); System.out.println("服务器IP地址 : " + serverIp); System.out.println("服务器主机名 : " + hostname); System.out.println("容器实际监听端口 : " + realListenPort); System.out.println("用户请求目标端口 : " + userRequestPort); }
场景2:Spring Boot 内嵌容器环境(无请求上下文时主动获取端口)
如果需要在非请求流程中获取服务启动端口,可以通过Spring的环境配置或者容器启动事件获取,即使配置了随机端口(server.port=0)也能拿到实际绑定的端口:
方式1:注入Environment直接读取
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; import java.net.InetAddress; @Component public class ServerInfoUtil { @Autowired private Environment env; public void printServerInfo() throws Exception { InetAddress ip = InetAddress.getLocalHost(); String serverIp = ip.getHostAddress(); // 优先取实际启动的端口,无则取配置端口,默认值8080 String port = env.getProperty("local.server.port", env.getProperty("server.port", "8080")); System.out.println("服务器IP地址 : " + serverIp); System.out.println("服务启动端口 : " + port); } }
方式2:监听容器启动事件获取端口
import org.springframework.boot.web.context.WebServerInitializedEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; @Component public class ServerPortHolder implements ApplicationListener<WebServerInitializedEvent> { private int serverPort; @Override public void onApplicationEvent(WebServerInitializedEvent event) { // 直接从容器事件中拿到实际启动端口 this.serverPort = event.getWebServer().getPort(); } public int getServerPort() { return serverPort; } }
注意事项
- 如果服务器存在多网卡,
InetAddress.getLocalHost()可能会拿到回环地址127.0.0.1,需要遍历所有网卡接口获取对外可用的IP更准确 - 存在Nginx等反向代理的场景,根据需求选择获取实际监听端口还是用户请求端口
内容的提问来源于stack exchange,提问作者Deepak
相关产品推荐
相关产品推荐

