gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:23:45 27 4
gpt4 key购买 nike

在任何 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) 方法。如果在Engine下注册,container参数的类型应该是StandardEngine .由此,您可以调用 getService() 来获取对 Service 的引用。 .该服务有一个方法 findConnectors()。返回 Connector 的数组实例,反射(reflect)为您的服务配置的连接器(端点)。从他们那里,您可以通过调用 getPort() 获取配置的端口。

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

如果您不想在阀门中执行此操作,事情会变得有点脏,因为您将不得不使用内省(introspection)和破坏字段可见性控制。

这是在 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 类)。

关于java - 我需要知道我的 java webapp 在 webapp 启动时运行的 HTTP 和 HTTPS 端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7481432/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com