Pergunta

Se um cliente em Java chama um EJB remoto em um servidor diferente, como você pode obter o endereço IP do cliente? Note-se que é importante para obtê-lo a partir do servidor, porque o cliente é provável atrás de um firewall NAT, e neste caso, precisamos do endereço IP público.

NOTA: Embora possa ser preferencialmente uma solução genérica, no mínimo que eu poderia usar um que recupera o endereço IP de uma chamada EJB2 em JBoss 4.2.2

Foi útil?

Solução

Este artigo nos endereços wiki comunidade JBoss exatamente o seu problema. Antes da JBoss 5 o endereço IP, aparentemente, tem de ser analisado a partir do nome de segmento de trabalho. E essa parece ser a única maneira de fazê-lo em versões anteriores. Este é o fragmento de código fazendo isso (copiado a partir do link acima):

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;
}

Outras dicas

Você já tentou:? Java.rmi.server.RemoteServer.getClientHost ()

http : //java.sun.com/j2se/1.5.0/docs/api/java/rmi/server/RemoteServer.html#getClientHost ()

Eu acredito que o nome do segmento de trabalho atual contém um endereço IP do servidor, mas não IP do cliente desde tópicos são agrupados em vez de criada para cada chamada. Em JBoss 4, pode-se usar a seguinte solução alternativa para obter um endereço IP do 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);
        }

Graças à MicSim, eu aprendi que as lojas de nomes de rosca o endereço IP. Em JBoss 4.2.2 o nome thread para itens EJB2 parecido com este:

http-127.0.0.1-8080-2

(I assumir o http é opcional, dependendo do protocolo realmente utilizado).

Este pode então ser analisado com uma expressão regular como isso:

    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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top