para obtener acceso a esta configuración en tiempo de ejecución, es una forma de crear su propia válvula, se extendía desde ValveBase
y registrarlo en la configuración server.xml (ver http://tomcat.apache.org/tomcat-7.0-doc/config/valve.html) bajo su Engine
. Reemplace el método setContainer(Container container)
. Si se registra bajo el motor, el parámetro container
debe ser del tipo StandardEngine
. Desde allí, puede llamar al getService()
para obtener una referencia al Service
. El servicio tiene un método findConnectors()
. Eso devuelve una matriz de instancias Connector
, que refleja los conectores configurados (puntos finales) para su servicio. De ellos, puede obtener el puerto configurado llamando al getPort()
.
Deberá tener catalina.jar en su classpath de compilación. Tenga en cuenta que esto se invoca al inicio del servidor, por lo que tendrá que almacenar la información del puerto en algún almacenamiento disponible a nivel mundial si necesita acceder a él más adelante.
Si no desea hacerlo en una válvula, las cosas se vuelven un poco más sucias ya que tendrá que utilizar la introspección y romper la contención de la visibilidad del campo.
Esta es una muestra de un filtro estándar que extrae información de puerto en el init()
método
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();
}
}
}
Requiere commons-lang3 (para la clase FieldUtils).
Encontré este enlace: http://www.coderanch.com/t/364748/Servlets/java/Getting-server-port-number-servlet. Puede ser que ayude –