Как вы можете получить ip-адрес вызывающего абонента при вызове ejb?
-
06-07-2019 - |
Вопрос
Если клиент Java вызывает удаленный EJB на другом сервере, как вы можете получить IP-адрес клиента?Обратите внимание, что важно получить его с сервера, потому что клиент, скорее всего, находится за брандмауэром NAT, и в этом случае нам нужен общедоступный IP-адрес.
ПРИМЕЧАНИЕ:Хотя предпочтительно было бы использовать универсальное решение, как минимум, я мог бы использовать то, которое извлекает IP-адрес из вызова EJB2 в JBoss 4.2.2
Решение
Эта статья в вики сообщества JBoss решает именно вашу проблему. До JBoss 5 IP-адрес, очевидно, должен быть проанализирован по имени рабочего потока. И это, кажется, единственный способ сделать это на более ранних версиях. Вот фрагмент кода, который делает это (скопировано из ссылки выше):
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;
}
Другие советы
Вы пробовали: java.rmi.server.RemoteServer.getClientHost ()?
http : //java.sun.com/j2se/1.5.0/docs/api/java/rmi/server/RemoteServer.html#getClientHost () р>
Я считаю, что имя текущего рабочего потока содержит IP-адрес сервера, но не IP-адрес клиента, поскольку потоки объединяются, а не создаются для каждого вызова. В JBoss 4 можно использовать следующий обходной путь для получения IP-адреса клиента:
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);
}
Благодаря MicSim я узнал, что в имени потока хранится IP-адрес.В JBoss 4.2.2 имя потока для элементов EJB2 выглядит следующим образом:
http-127.0.0.1-8080-2
(Я предполагаю, что http является необязательным, в зависимости от фактически используемого протокола).
Затем это может быть проанализировано с помощью регулярного выражения следующим образом:
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 "";