Чтобы получить доступ к этой конфигурации во время выполнения, одним из способов является создание собственного Valve с расширением ValveBase
и регистрация его в конфигурации server.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();
}
}
}
Требуется commons-lang3 (для класса FieldUtils).