我需要知道我的java webapp在webapp启动时运行的HTTP和HTTPS端口
在发生任何http或https请求之前,是否可以从Web应用程序的java代码中找到为Tomcat Web服务器配置的HTTP和HTTPS端口。
我在应用程序启动时需要这些信息。 我不想等待某人发起HTTP请求并调用getServerPort()。
我想要的是在启动webapplication时弄清楚HTTP和HTTPS端口。
这可能吗? 我在这个问题上搜索得很好但很难找到任何解决方案。
要在运行时访问此配置,一种方法是创建自己的Valve,从ValveBase
扩展并在server.xml配置中注册它(请参阅http://tomcat.apache.org/tomcat-7.0-doc/config/ valve.html )在您的Engine
。 重写setContainer(Container container)
方法。 如果在Engine下注册,则container
参数应为StandardEngine
类型。 从那里,您可以调用getService()
来获取对Service
的引用。 该服务有一个方法findConnectors()
。 返回一个Connector
实例数组,反映服务的已配置连接器(端点)。 通过调用getPort()
,您可以从中获取配置的端口。
您需要在构建类路径上安装catalina.jar。 请注意,这是在服务器启动时调用的,因此如果您以后需要访问它,则必须将端口信息存储在某些全局可用的存储中。
如果您不想在阀门中进行操作,那么事情会变得更脏,因为您必须使用内省并打破现场可视性限制。
这是一个标准filter的示例,它在init()
方法中提取端口信息
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import org.apache.catalina.Container; import org.apache.catalina.connector.Connector; import org.apache.catalina.core.StandardContext; import org.apache.catalina.core.StandardEngine; import org.apache.commons.lang3.reflect.FieldUtils; public class TestFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { arg2.doFilter(arg0, arg1); } @Override public void init(FilterConfig arg0) throws ServletException { ServletContext ctx = arg0.getServletContext(); try { Object o = FieldUtils.readField(ctx, "context", true); StandardContext sCtx = (StandardContext) FieldUtils.readField(o, "context", true); Container container = (Container) sCtx; Container c = container.getParent(); while (c != null && !(c instanceof StandardEngine)) { c = c.getParent(); } if (c != null) { StandardEngine engine = (StandardEngine) c; for (Connector connector : engine.getService().findConnectors()) { // Get port for each connector. Store it in the ServletContext or whatever System.out.println(connector.getPort()); } } } catch (Exception e) { e.printStackTrace(); } } }
它需要commons-lang3(对于FieldUtils类)。
你有没有提到: http : //tomcat.apache.org/tomcat-4.0-doc/config/ajp.html
在conf / server.xml中的Connector配置中。
这是一个样本,