java - 在 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 应用程序的端口?
解决方案
在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
并利用它的属性。
推荐阅读
- python - 从python打开另一个文件
- javascript - jQuery 为标签使用特定的 UL 元素
- java - 在片段之间发送结果的最佳方式?
- ios - Appcelerator - iOS:TEXT_ALIGNMENT 属性的属性字符串?
- sql - 如何使用 SQL 查询在同一列中减去两行的值?
- c - 计算c中e位数的应用程序
- javafx-8 - javafx 中的 obj 文件加载器提供了一个透明的网格
- python - 为什么 url 从 python scrapy 中消失?
- php - 即使我给自定义 VM 提供了 4GB 内存,PhpStorm 也很慢
- redux - 是否可以在 redux-saga 中同步调用 store.dispatch?