在servlet容器启动时检索服务器的端口(独立于服务器)

时间:2014-04-04 20:28:54

标签: java jersey jax-rs jersey-2.0

我想要检索我的Jersey 2.6容器正在运行的服务器的主机和端口。该容器当前部署在Tomcat 7上。但是,我被迫在每个支持Java servlet的服务器上发布我的应用程序。在这种情况下,它是Tomcat,但解决方案必须与服务器无关。

我已经注册了Jersey启动类,我想在那里获取主机和端口。但是,我还没有找到任何解决方案来获得该端口。

我的类,在我的Jersey servlet初始化时调用:

public class ServletInitialization extends ResourceConfig {
    public ServletInitialization() {
        int port    = ???;
        String host = InetAddress.getLocalHost().getHostName();
    }
}

在我的研究中,我找到了一个3 year old question,它引用了同样的问题。接受的答案集中在一个tomcat上,我认为只能在Tomcat上正确运行(import org.apache.catalina.*)。我想避免修改服务器引擎,服务器配置,也不要在启动时将任何内容注入服务器。

我曾尝试使用普通的Java servlet,但也找不到在那里获取端口的方法:

public class ServletInitializationPlain extends HttpServlet {

    @Override
    public void init() {
       int port = ???;  
    }   
}

有人知道如何在启动时从servlet容器中检索端口(与运行它的服务器无关)吗?


修改

我已经接受了steohans解决方案,但我认为这很棘手,为什么在启动Web容器时不会调用我的ServletInitialization。因为实际上ResourceConfig不是Servlet。我现在将解释这个问题:

我扩展了ResourceConfig.class,它是Application.class的子类。这个Application类不是一个扩展的Java servlet,而是一个自己的Jersey类。我虽然在Web容器的启动时调用了一个Application。但是,在Jersey规范中可以读取,Application类本身需要由ServletContainer.class处理,ServletContainer.class是Java Servlet的子类。 此处理在web.xml中定义。 最后,这里的一切都是servlet。

由于无法在启动时获取端口,因此在发送请求时当然是可能的:

@Path("example")
public class ServletMethods {
    @GET
    public Response example(@HeaderParam("Host") String host) {
         return Response.ok(host).build();
    }
}

2 个答案:

答案 0 :(得分:2)

序言:确保区分Web容器(也称为servlet容器)p.a. tomcat的。泽西岛ServletContainer类,它只是一个servlet。 (见javadoc

<强>短: 你不能,你只能在收到请求后立即获得监听端口。

<强>长: 一个Servlet没有绑定到一个特定端口,因此不应该有一个函数来检索侦听端口。 (没有特定的容器)

您的Web容器具有组织侦听的任务,甚至不必自行处理。例如,你也可以使用apache来监听请求,将它们传递给调用你的Servlet的tomcat。当你的init函数被调用时,你的web容器根本不需要监听。

你也可以告诉tomcat在不同的端口上监听,将请求发送到同一个Servlet。如果您想了解更多相关内容,请查看tomcat连接器上的this教程。

但是,只要您有请求,就知道使用了哪个端口,并且可以使用getLocalPort()中的HttpServletRequest来获取端口。

答案 1 :(得分:2)

我找到了这个答案,它有效Get the server port number from tomcat with out a request

List<String> getEndPoints() throws MalformedObjectNameException,
        NullPointerException, UnknownHostException, AttributeNotFoundException,
        InstanceNotFoundException, MBeanException, ReflectionException {
    MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
    Set<ObjectName> objs = mbs.queryNames(new ObjectName("*:type=Connector,*"),
            Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));
    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) {
            String host = addr.getHostAddress();
            String ep = scheme + "://" + host + ":" + port;
            endPoints.add(ep);
        }
    }
    return endPoints;
}

不幸的是,这只适用于tomcat