Pregunta

Si un cliente Java llama a un EJB remoto en un servidor diferente, ¿cómo puede obtener la dirección IP del cliente? Tenga en cuenta que es importante obtenerlo del servidor, porque es probable que el cliente esté detrás de un firewall NAT, y en este caso necesitamos la dirección IP pública.

NOTA: Aunque preferiblemente sería una solución genérica, como mínimo podría usar una que recupere la dirección IP de una llamada EJB2 en JBoss 4.2.2

¿Fue útil?

Solución

Este artículo en el wiki de la comunidad JBoss aborda exactamente su problema. Antes de JBoss 5, la dirección IP aparentemente debe analizarse a partir del nombre del subproceso de trabajo. Y esa parece ser la única forma de hacerlo en versiones anteriores. Este es el fragmento de código que lo hace (copiado del enlace anterior):

private String getCurrentClientIpAddress() {
    String currentThreadName = Thread.currentThread().getName();
    System.out.println("Threadname: "+currentThreadName);
    int begin = currentThreadName.indexOf('[') +1;
    int end = currentThreadName.indexOf(']')-1;
    String remoteClient = currentThreadName.substring(begin, end);
    return remoteClient;
}

Otros consejos

Creo que el nombre del subproceso de trabajo actual contiene una dirección IP del servidor, pero no la IP del cliente, ya que los subprocesos se agrupan en lugar de crearse para cada llamada. En JBoss 4, se puede usar la siguiente solución para obtener una dirección IP del cliente:

        try {
            //Reflection is used to avoid compile-time dependency on JBoss internal libraries
            Class clazz = Class.forName("org.jboss.web.tomcat.security.HttpServletRequestPolicyContextHandler");
            Field requestContextField = clazz.getDeclaredField("requestContext");
            requestContextField.setAccessible(true);
            ThreadLocal ctx = (ThreadLocal) requestContextField.get(null);
            ServletRequest req = ((ServletRequest) ctx.get());
            return req==null?null:req.getRemoteAddr();
        } catch (Exception e) {
            LOG.log(Level.WARNING, "Failed to determine client IP address",e);
        }

Gracias a MicSim, aprendí que el nombre del hilo almacena la dirección IP. En JBoss 4.2.2, el nombre del hilo para los elementos EJB2 se ve así:

  

http-127.0.0.1-8080-2

(supongo que el http es opcional, dependiendo del protocolo realmente utilizado).

Esto se puede analizar con una expresión regular de la siguiente manera:

    Pattern pattern = Pattern.compile("\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b");
    Matcher matcher = pattern.matcher(Thread.currentThread().getName());
    if (matcher.find()) {
        return matcher.group();
    }
    return "";
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top