一尘不染

我需要知道我的Java WebApp正在Webapp启动时运行的HTTP和HTTPS端口

tomcat

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

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

我想要的是在启动Web应用程序时弄清楚HTTP和HTTPS端口。

这可能吗?我对这个问题进行了很好的搜索,但是几乎找不到任何解决方案。


阅读 302

收藏
2020-06-16

共1个答案

一尘不染

要在运行时访问此配置,一种方法是创建自己的Valve,从ValveBaseServer.xml配置进行扩展并将其注册(请参阅http://tomcat.apache.org/tomcat-7.0-doc/config/valve
(.html)Engine。覆盖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();
        }


    }

}

它需要commons-lang3(用于FieldUtils类)。

2020-06-16