我需要知道HTTP和HTTPS端口我的java webapp在webapp启动上运行



是否有可能在任何HTTP或HTTPS请求发生之前从web应用程序的java代码中找出为Tomcat web服务器配置的HTTP和HTTPS端口?

我需要应用程序启动的信息。我不想等待某人发起HTTP请求并调用getServerPort()。

我想要的是在web应用程序启动时找出HTTP和HTTPS端口。

这可能吗?我对这个问题进行了很好的研究,但几乎没有找到任何解决方法。

要在运行时访问此配置,一种方法是创建您自己的Valve,从ValveBase扩展并在Engine下的server.xml配置(参见http://tomcat.apache.org/tomcat-7.0-doc/config/valve.html)中注册它。覆盖setContainer(Container container)方法。如果在引擎下注册,container参数应该是StandardEngine类型。由此,您可以调用getService()以获取对Service的引用。该服务有一个方法findConnectors()。它返回一个Connector实例数组,反映为您的服务配置的连接器(端点)。从它们,您可以通过调用getPort()获得配置的端口。

您需要在构建类路径中放置catalina.jar。注意,这是在服务器启动时调用的,所以如果以后需要访问端口信息,您必须将端口信息存储在一些全局可用的存储中。

如果你不想在阀门中这样做,事情会变得有点脏,因为你必须使用自省和打破字段可见性限制。

这是在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();
        }

    }
}

需要common_lang3(用于FieldUtils类)

您参考过:http://tomcat.apache.org/tomcat-4.0-doc/config/ajp.html

在conf/server.xml中,在Connector配置中

这是一个示例,

<!-- A "Connector" represents an endpoint by which requests are received
     and responses are returned. Documentation at :
     Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
     Java AJP  Connector: /docs/config/ajp.html
     APR (HTTP/AJP) Connector: /docs/apr.html
     Define a non-SSL HTTP/1.1 Connector on port 8080
-->
<Connector port="8080" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           redirectPort="8443" />

最新更新