java - 无需请求即可从tomcat获取服务器端口号

标签 java tomcat jakarta-ee tomcat6 application-server

是否有任何可用的 Tomcat API 或配置可以告诉应用程序(可能在启动时),它在没有请求的情况下运行在哪个端口上?

想象一个场景,有两个 Web 应用程序在同一个 Tomcat 中运行,其中一个需要从另一个调用 Web 服务。我们不希望请求离开 Tomcat(如果您使用 Apache 服务器名称或绝对 URL,请求会出去然后再回来,它可以转到任何实例)然后回来。为此我知道机器的名称,但无法获取端口号。我知道我可以对这些信息进行硬编码,但我不想这样做,因为我希望我的 war 文件与应用程序服务器无关。

我知道如果我们有一个 HTTPServletRequest 就可以找到它

这仅适用于 Tomcat 6,不适用于 Tomcat 7

最佳答案

有了这个:

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

你会得到一个这样的列表:

[http://192.168.1.22:8080]

关于java - 无需请求即可从tomcat获取服务器端口号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3867197/

相关文章:

java - 如何使用 JDBC 连接 XAMPP MySQL 本地数据库?

firefox - tomcat(apache-tomcat-6.0.32)的 CSRF 方法在 firefox 14.0.1 上无法正常工作

tomcat - 部署到tomcat服务器时出现JPA错误

java - 如何将实时变化的数据获取到本地服务器?

java - OS X 上的简单 JMS 客户端

java - 自定义过滤器突然破坏@WebMvcTest

java - 如何从 Jena RDF Inf 模型中的节点值获取个人名称

Java react 器通量未根据预期进行映射

java - 如何将额外的服务器库添加到 Openshift 上的 Tomcat(JBossEWS)?

java - netbeans 7.2.1 中没有用于映射上下文监听器的 web.xml 文件