Come si ottiene l'indirizzo IP chiamante su una chiamata ejb?
-
06-07-2019 - |
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
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
Hai provato: java.rmi.server.RemoteServer.getClientHost ()?
http : //java.sun.com/j2se/1.5.0/docs/api/java/rmi/server/RemoteServer.html#getClientHost ()
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 "";