首页 > 解决方案 > 在 ContextListener 的内部,我如何找出 Web App 正在运行的端口

问题描述

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

我有一个以 JSP 页面作为前端的 Java Web 应用程序项目。该项目实现了一个ServletContextListener连接到后端。DBQuery此 ContextListener 通过在其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 应用程序的端口?

标签: javaportinetaddressservletcontextlistener

解决方案


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();
}

所以主要是实例化 aMBeanServer并利用它的属性。


推荐阅读