Question

Si un client Java appelle un EJB distant sur un autre serveur, comment pouvez-vous obtenir l'adresse IP du client? Notez qu'il est important de l'obtenir du serveur, car le client est probablement derrière un pare-feu NAT, et dans ce cas nous avons besoin de l'adresse IP publique.

REMARQUE: bien qu’il s’agisse de préférence d’une solution générique, je peux au moins en utiliser une qui récupère l’adresse IP d’un appel EJB2 sur JBoss 4.2.2

.
Était-ce utile?

La solution

Cet article du wiki de la communauté JBoss aborde exactement votre problème. Avant JBoss 5, l'adresse IP devait apparemment être analysée à partir du nom du thread de travail. Et cela semble être le seul moyen de le faire sur les versions précédentes. Voici l'extrait de code utilisé (copié à partir du lien ci-dessus):

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

Autres conseils

Avez-vous essayé: java.rmi.server.RemoteServer.getClientHost ()?

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

Je pense que le nom du thread de travail actuel contient une adresse IP du serveur, mais pas celle du client, car les threads sont regroupés plutôt que créés pour chaque appel. Dans JBoss 4, vous pouvez utiliser la solution de contournement suivante pour obtenir une adresse IP du 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);
        }

Grâce à MicSim, j'ai appris que le nom du thread stocke l'adresse IP. Dans JBoss 4.2.2, le nom du thread pour les éléments EJB2 se présente comme suit:

  

http-127.0.0.1-8080-2

(Je suppose que le protocole http est facultatif, en fonction du protocole utilisé).

Ceci peut ensuite être analysé avec une expression régulière comme suit:

    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 "";
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top