我想要检索我的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();
}
}
答案 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