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

Java 在servlet容器启动时检索服务器的端口(独立于服务器),java,jersey,jax-rs,jersey-2.0,Java,Jersey,Jax Rs,Jersey 2.0,我想检索运行Jersey 2.6容器的服务器的主机和端口。该容器当前部署在Tomcat 7上。然而,我不得不在每台支持Javaservlet的服务器上发布可部署的应用程序。在本例中,它是一个Tomcat,但解决方案必须独立于服务器 我已经注册了一个Jersey启动类,我想在其中获取主机和端口。但是,我还没有找到任何解决方案来获取端口 初始化Jersey servlet时调用的My类: public class ServletInitialization extends ResourceConfi

我想检索运行Jersey 2.6容器的服务器的主机和端口。该容器当前部署在Tomcat 7上。然而,我不得不在每台支持Javaservlet的服务器上发布可部署的应用程序。在本例中,它是一个Tomcat,但解决方案必须独立于服务器

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

初始化Jersey servlet时调用的My类:

public class ServletInitialization extends ResourceConfig {
    public ServletInitialization() {
        int port    = ???;
        String host = InetAddress.getLocalHost().getHostName();
    }
}
在我的研究中,我发现了一个相同的问题。公认的答案集中在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的子类。这个应用程序类不是一个扩展的Javaservlet,而是一个自己的类。我认为应该在web容器启动时调用应用程序。但是,在Jersey规范中可以看到,应用程序类本身需要由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();
    }
}

序言:确保区分web容器(也称为servlet容器)和tomcat。还有Jersey
ServletContainer
类,它只是一个servlet。(见附件)

Short: 您不能,只有在收到请求后才能获得侦听端口

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

您的web容器有组织侦听的任务,甚至不必自己处理。例如,您还可以使用apache侦听请求,将它们传递给tomcat,后者调用您的Servlet。此外,当调用init函数时,web容器根本不需要侦听

您还可以让tomcat监听两个不同的端口,将请求发送给同一个Servlet。如果您想了解更多信息,请参阅有关tomcat连接器的教程


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

序言:确保区分web容器(也称为servlet容器)和p.a.tomcat。还有Jersey
ServletContainer
类,它只是一个servlet。(见附件)

Short: 您不能,只有在收到请求后才能获得侦听端口

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

您的web容器有组织侦听的任务,甚至不必自己处理。例如,您还可以使用apache侦听请求,将它们传递给tomcat,后者调用您的Servlet。此外,当调用init函数时,web容器根本不需要侦听

您还可以让tomcat监听两个不同的端口,将请求发送给同一个Servlet。如果您想了解更多信息,请参阅有关tomcat连接器的教程


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

我找到了这个答案,它是有效的

List getEndPoints()引发格式错误的ObjectNameException,
NullPointerException、UnknownHostException、AttributeNotFoundException、,
InstanceNotFoundException、MBeanException、ReflectionException{
MBeanServer mbs=ManagementFactory.getPlatformMBeanServer();
设置objs=mbs.queryNames(新对象名(“*:type=Connector,*”),
Query.match(Query.attr(“协议”)、Query.value(“HTTP/1.1”));
字符串hostname=InetAddress.getLocalHost().getHostName();
InetAddress[]地址=InetAddress.getAllByName(主机名);
ArrayList端点=新的ArrayList();
for(迭代器i=objs.Iterator();i.hasNext();){
ObjectName obj=i.next();
字符串scheme=mbs.getAttribute(obj,“scheme”).toString();
字符串端口=obj.getKeyProperty(“端口”);
用于(InetAddress地址:地址){
字符串host=addr.getHostAddress();
字符串ep=scheme+“:/”+host+“:”+port;
端点。添加(ep);
}
}
返回端点;
}

不幸的是,这只适用于tomcat

我找到了这个答案,而且它是有效的

List getEndPoints()引发格式错误的ObjectNameException,
NullPointerException、UnknownHostException、AttributeNotFoundException、,
InstanceNotFoundException、MBeanException、ReflectionException{
MBeanServer mbs=ManagementFactory.getPlatformMBeanServer();
设置objs=mbs.queryNames(新对象名(“*:type=Connector,*”),
Query.match(Query.attr(“协议”),Q
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;
}