Domanda

Se un client Java chiama un bean remoto su un altro server, come si ottiene l'indirizzo IP del client? Si noti che è importante ottenerlo dal server, poiché il client è probabilmente protetto da un firewall NAT e in questo caso è necessario l'indirizzo IP pubblico.

NOTA: sebbene sarebbe preferibilmente una soluzione generica, potrei almeno usarne una che recuperi l'indirizzo IP da una chiamata EJB2 su JBoss 4.2.2

È stato utile?

Soluzione

Questo articolo sulla community JBoss wiki risolve esattamente il tuo problema. Prima di JBoss 5, a quanto pare, l'indirizzo IP deve essere analizzato dal nome del thread di lavoro. E quello sembra essere l'unico modo per farlo nelle versioni precedenti. Questo è lo snippet di codice che lo sta facendo (copiato dal link sopra):

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

Altri suggerimenti

Credo che il nome dell'attuale thread di lavoro contenga un indirizzo IP del server, ma non l'IP del client poiché i thread vengono raggruppati anziché creati per ogni chiamata. In JBoss 4, è possibile utilizzare la seguente soluzione alternativa per ottenere un indirizzo IP del client:

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

Grazie a MicSim, ho appreso che il nome del thread memorizza l'indirizzo IP. In JBoss 4.2.2 il nome del thread per gli elementi EJB2 è simile al seguente:

  

http-127.0.0.1-8080-2

(suppongo che http sia facoltativo, a seconda del protocollo effettivamente utilizzato).

Questo può quindi essere analizzato con un'espressione regolare così:

    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 "";
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top