2011-09-20 21 views
8

¿Es posible encontrar los puertos HTTP y HTTPS configurados para un servidor web Tomcat desde el código java de la aplicación web antes de que se realicen las solicitudes http o https? .Necesito saber el puerto HTTP y HTTPS que está ejecutando mi aplicación web java webapp startup

Necesito esta información sobre el inicio de la aplicación. No quiero esperar a que alguien inicie una solicitud HTTP y llame a getServerPort().

Lo que quiero es descubrir los puertos HTTP y HTTPS en el inicio de la aplicación weba.

¿Esto es posible? Busqué muy bien este problema pero casi no encontré ninguna solución.

+0

Encontré este enlace: http://www.coderanch.com/t/364748/Servlets/java/Getting-server-port-number-servlet. Puede ser que ayude –

Respuesta

5

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).

+1

Estaba esperando una respuesta mucho más simple. Pero parece que no hay una solución simple a este problema, ya que este tipo de casos no está cubierto por la API del servlet. Por lo tanto, marcaré esta pregunta como correcta. –

-1

En el conf/server.xml, en la configuración del conector.

Este es un ejemplo,

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