【问题标题】:I need to know the HTTP and HTTPS port my java webapp is running on webapp startup我需要知道我的 java webapp 在 webapp 启动时运行的 HTTP 和 HTTPS 端口
【发布时间】:2011-09-20 07:16:08
【问题描述】:

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

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

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

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

【问题讨论】:

标签: java tomcat servlets


【解决方案1】:

要在运行时访问此配置,一种方法是创建您自己的 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();
        }


    }

}

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

【讨论】:

  • 我期待一个更简单的答案。但似乎这个问题没有简单的解决方案,因为 servlet api 没有涵盖这种情况。因此,我会将这个问题标记为正确。
【解决方案2】:

【讨论】:

    【解决方案3】:

    在 conf/server.xml 中,在连接器配置中。

    这是一个示例,

    <!-- 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" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多