在ContextListener的内部结构中,我如何找出运行Web应用程序的端口

问题描述

在ContextListener的内部,我如何找出Web App正在运行的端口

我有一个以JSP页面为前端的Java Web应用程序项目。该项目实现了servletcontextlistener以连接到后端。此ContextListener通过在其DBQuery方法中实例化访问类contextinitialized来访问数据库

ServletContext ctx = contextEvent.getServletContext();
dbQuery = new DBQuery();
ctx.setAttribute("dbQuery",dbQuery);

然后,JSP页面通过以下方式引用此DBQuery对象:

getServletContext().getAttribute("dbQuery");

并根据需要调用DBQuery方法

现在是问题所在:在DBQuery类中,我需要根据Web应用程序运行的主机和端口来做不同的事情。

我找到了一种在DBQuery中确定主机名方法

import java.net.InetAddress;
String hostName = InetAddress.getLocalHost().getHostName();

奇怪的是,InetAddress似乎没有获取 端口号 方法。如何在DBQuery类中找到Web应用程序在其上运行的端口?

解决方法

Steve的评论中,我们观察到GitHub gist,然后提出了以下经过修改的代码,该代码完全符合要求:

String port = "80";
try {
     MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
     Set<ObjectName> objs = mbs.queryNames( new ObjectName( "*:type=Connector,*" ),Query.match( Query.attr( "protocol" ),Query.value( "HTTP/1.1" ) ) );
     for ( ObjectName obj : objs ) {
         String scheme = mbs.getAttribute( obj,"scheme" ).toString();
         port = obj.getKeyProperty( "port" );
         break;
     }
} catch ( MalformedObjectNameException | UnknownHostException | MBeanException | AttributeNotFoundException | InstanceNotFoundException | ReflectionException ex ) {
     ex.printStackTrace();
}

所以最主要的是实例化MBeanServer并利用其属性。