Как вы можете получить вызывающий IP-адрес на EJB-вызов? - PullRequest
2 голосов
/ 18 июня 2009

Если клиент java вызывает удаленный EJB на другом сервере, как вы можете получить IP-адрес клиента? Обратите внимание, что важно получить его с сервера, потому что клиент, скорее всего, находится за брандмауэром NAT, и в этом случае нам нужен публичный IP-адрес.

ПРИМЕЧАНИЕ. Хотя желательно использовать универсальное решение, как минимум я мог бы использовать решение, которое извлекает IP-адрес из вызова EJB2 на JBoss 4.2.2

Ответы [ 4 ]

2 голосов
/ 26 июня 2009

Эта статья в вики-сообществе 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;
}
1 голос
/ 09 ноября 2012

Я считаю, что имя текущего рабочего потока содержит 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);
        }
1 голос
/ 26 июня 2009
0 голосов
/ 29 июня 2009

Благодаря 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 "";
...