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

Bas*_*usa 9 java tomcat servlets

在发生任何http或https请求之前,是否可以从Web应用程序的java代码中找到为Tomcat Web服务器配置的HTTP和HTTPS端口.

我在应用程序启动时需要这些信息.我不想等待某人发起HTTP请求并调用getServerPort().

我想要的是在webapplication启动时找出HTTP和HTTPS端口.

这可能吗?我在这个问题上搜索得很好但很难找到任何解决方案.

pap*_*pap 5

要在运行时访问此配置,一种方法是创建自己的Valve,从ValveBaseserver.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.请注意,这是在服务器启动时调用的,因此如果您以后需要访问它,则必须将端口信息存储在某些全局可用的存储中.

如果您不想在阀门中进行操作,那么事情会变得更脏,因为您必须使用内省并打破现场可视性控制.

这是一个标准过滤器的示例,它提取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();
        }


    }

}
Run Code Online (Sandbox Code Playgroud)

它需要commons-lang3(对于FieldUtils类).