Java 无需请求即可从tomcat获取服务器端口号
是否有任何Tomcat API或配置可以告诉应用程序(可能是在启动时),它在哪个端口上运行而不需要请求 假设有两个web应用程序在同一个Tomcat中运行,其中一个需要从另一个调用web服务。我们不希望请求离开Tomcat(如果您使用Apache服务器名称或绝对URL,请求将发出并再次返回,它可以转到任何实例)然后返回。为此,我知道机器的名称,但无法获得端口号。我知道我可以硬编码这些信息,但我不想这样做,因为我希望我的Java 无需请求即可从tomcat获取服务器端口号,java,tomcat,jakarta-ee,tomcat6,application-server,Java,Tomcat,Jakarta Ee,Tomcat6,Application Server,是否有任何Tomcat API或配置可以告诉应用程序(可能是在启动时),它在哪个端口上运行而不需要请求 假设有两个web应用程序在同一个Tomcat中运行,其中一个需要从另一个调用web服务。我们不希望请求离开Tomcat(如果您使用Apache服务器名称或绝对URL,请求将发出并再次返回,它可以转到任何实例)然后返回。为此,我知道机器的名称,但无法获得端口号。我知道我可以硬编码这些信息,但我不想这样做,因为我希望我的war文件与应用程序服务器无关 我知道如果我们有HTTPServletRequ
war
文件与应用程序服务器无关
我知道如果我们有HTTPServletRequest,我们可以找到它
这只适用于Tomcat 6,不适用于Tomcat 7。嗯,如果没有请求,应用程序如何在Tomcat中启动?也许在这里我会有一段时间头脑发热,但我认为在请求到达之前不会加载任何类。当然,您可以拥有独立于任何特定请求的类,但它们需要一个请求才能在某个时刻启动。我不完全确定您是否可以从所需环境配置中的代码访问Tomcat端口。您是否考虑过将Web服务的完整URL作为配置PARAM/SET(可能在A.Trimes文件中)传递给应用程序?p> 这样,您就不必硬编码端口并将两个应用程序解耦,这样您就可以在外部tomcat上技术上拥有web服务,但仍然可以通过更改属性来访问它,避免代码重新构建。您可以使用。但我不认为这是应用服务器不可知论 正如我所解释的,我将共享一个自定义类,作为通过JNDI在同一tomcat实例中运行应用程序的注册表 在启动过程中,通过
ContextListener
或通过Spring容器事件,我将通过JNDI查找获得注册表,使用从servletcontext.contextpath获得的url添加我的web应用程序实例,最后注册一个侦听器以听到其他应用程序注册自己。这是我能想到的更多的服务器不可知论
获取端口不会与服务器无关,应该使用上下文参数
编辑:很抱歉,我忘了说我描述的是在上下文之间共享对象,但是不,除非您使用一些服务器API(根本不可知),否则您不可能知道端口。之前在一个大型分布式项目中,我使用的设计是让中央服务使用中央服务的URL和端口初始化几个服务 显然,这意味着中央服务必须维护一个要初始化的服务列表(URL和端口)。服务器端口号不存在。它可以有任意数量的端口号。所以你问的没有意义。与特定请求关联的端口号确实有意义。
- 获取Tomcat/Server实例的MBean/JMX对象
- 从那里获取与虚拟服务器实例相关的数据
然后可以通过协议连接器[RMI/IIOP]或协议适配器[SNMP/HTTP]实现的各种协议公开MBeanServer的内容。在这种情况下,使用SNMP适配器将是一种更好的方法,这样就可以在不知道其他应用程序服务器的确切IP/端口的情况下放置SNMP陷阱如果要访问同一服务器实例上的应用程序,只需省略URL的服务器部分即可。举例说明你能取得的成就。当前文档位于
http://example.com:8080/app2/doc.html
变成xxx.html
http://example.com:8080/app2/xxx.html
变成。/xxx.html
http://example.com:8080/xxx.html
变成。/xxx.html
http://example.com:8080/xxx.html
变成。/foo/xxx.html
http://example.com:8080/foo/xxx.html
变成。/../xxx.html
(无法超越根目录)http://example.com:8080/xxx.html
变成/xxx.html
这可能就是您要找的。http://example.com:8080/xxx.html
变成//other.com/xxx.html
如果您想保留“https:http://example.com:8080/xxx.html
即使有,也有一些情况下它根本不重要,比如在NAT后面、某些防火墙后面等等。对于任何对我们如何解决这个问题感兴趣的人,这里是模拟代码
Server server = ServerFactory.getServer();
Service[] services = server.findServices();
for (Service service : services) {
for (Connector connector : service.findConnectors()) {
ProtocolHandler protocolHandler = connector.getProtocolHandler();
if (protocolHandler instanceof Http11Protocol
|| protocolHandler instanceof Http11AprProtocol
|| protocolHandler instanceof Http11NioProtocol) {
serverPort = connector.getPort();
System.out.println("HTTP Port: " + connector.getPort());
}
}
}
为此:
List<String> getEndPoints() throws MalformedObjectNameException,
NullPointerException, UnknownHostException, AttributeNotFoundException,
InstanceNotFoundException, MBeanException, ReflectionException {
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
QueryExp subQuery1 = Query.match(Query.attr("protocol"), Query.value("HTTP/1.1"));
QueryExp subQuery2 = Query.anySubString(Query.attr("protocol"), Query.value("Http11"));
QueryExp query = Query.or(subQuery1, subQuery2);
Set<ObjectName> objs = mbs.queryNames(new ObjectName("*:type=Connector,*"), query);
String hostname = InetAddress.getLocalHost().getHostName();
InetAddress[] addresses = InetAddress.getAllByName(hostname);
ArrayList<String> endPoints = new ArrayList<String>();
for (Iterator<ObjectName> i = objs.iterator(); i.hasNext();) {
ObjectName obj = i.next();
String scheme = mbs.getAttribute(obj, "scheme").toString();
String port = obj.getKeyProperty("port");
for (InetAddress addr : addresses) {
if (addr.isAnyLocalAddress() || addr.isLoopbackAddress() ||
addr.isMulticastAddress()) {
continue;
}
String host = addr.getHostAddress();
String ep = scheme + "://" + host + ":" + port;
endPoints.add(ep);
}
}
return endPoints;
}
public void getipaddress和port()
抛出格式错误的ObjectNameException、NullPointerException、,
未知后异常{
MBeanServer beanServer=ManagementFactory.getPlatformMBeanServer();
设置objectNames=beanServer.queryNames(新的ObjectName(“*:type=Connector,*”),
Query.match(Query.attr(“协议”)、Query.value(“HTTP/1.1”));
字符串host=InetAddress.getLocalHost().getHostAddress();
String port=objectNames.iterator().next().getKeyProperty(“端口”);
System.out.println(“系统的IP地址:+主机”);
System.out.println(“tomcat服务器的端口:“+端口”);
}
公共服务
[http://192.168.1.22:8080]
public void getIpAddressAndPort()
throws MalformedObjectNameException, NullPointerException,
UnknownHostException {
MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> objectNames = beanServer.queryNames(new ObjectName("*:type=Connector,*"),
Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));
String host = InetAddress.getLocalHost().getHostAddress();
String port = objectNames.iterator().next().getKeyProperty("port");
System.out.println("IP Address of System : "+host );
System.out.println("port of tomcat server : "+port);
}
public String getPort() {
MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> objectNames;
try {
objectNames = beanServer.queryNames(new ObjectName("*:type=ProtocolHandler,*"),
Query.match(Query.attr("name"), Query.value("\"http-*")));
} catch (MalformedObjectNameException e) {
LOGGER.error("Port not defined!", e);
}
return objectNames.iterator().next().getKeyProperty("port");
}
public String getSecurePort() {
MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> objectNames;
try {
objectNames = beanServer.queryNames(new ObjectName("*:type=ProtocolHandler,*"),
Query.match(Query.attr("name"), Query.value("\"https-*")));
} catch (MalformedObjectNameException e) {
LOGGER.error("SecuredPort not defined!", e);
}
return objectNames.iterator().next().getKeyProperty("port");
}