Frage

Wenn ein Java-Client einen Remote-EJB auf einem anderen Server aufruft, wie können Sie die Client-IP-Adresse? Beachten Sie, dass es wichtig ist, sie vom Server zu bekommen, weil der Client hinter einem NAT-Firewall wahrscheinlich ist, und in diesem Fall müssen wir die öffentliche IP-Adresse.

Hinweis: Obwohl es wäre vorzugsweise eine generische Lösung sein, auf einem Minimum ich eine verwenden könnte, die die IP-Adresse von einem EJB2 Anruf auf JBoss 4.2.2

rufen
War es hilfreich?

Lösung

dieser Artikel auf dem Community-Wiki JBoss-Adressen genau Ihr Problem. Vor der JBoss 5 die IP-Adresse hat offenbar aus den Worker-Thread Namen analysiert werden. Und das scheint die einzige Möglichkeit zu sein, es Versionen auf früher zu tun. Dies ist der Code-Snippet, es zu tun (aus dem obigen Link kopiert):

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

Andere Tipps

Haben Sie versucht: java.rmi.server.RemoteServer.getClientHost ()

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

Ich glaube, dass Name des aktuellen Arbeitsthread enthält eine IP-Adresse des Servers, aber nicht IP das Clients, da Threads zusammengefasst werden, anstatt für jeden Anruf erstellt. In JBoss 4, kann man die folgende Abhilfe verwenden, um eine IP-Adresse des Clients zu erhalten:

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

Dank MicSim, erfuhr ich, dass der Thread-Name die IP-Adresse speichert. In JBoss 4.2.2 der Thread-Namen für EJB2 Artikel wie folgt aussehen:

  

http-127.0.0.1-8080-2

(ich nehme an dem http optional ist, abhängig von dem verwendeten Protokoll tatsächlich).

Dies kann dann mit einem regulären Ausdruck analysiert werden, wie so:

    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 "";
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top