2012-03-16 4 views
0

В сеансовом компоненте EJB мне нужно знать IP-адрес, с которым клиент вызвал метод. Возможно ли получить эту информацию в JBoss 4.2.3?Получение IP-адреса вызывающего объекта метода EJB в JBoss 4.2.3

+0

Это вопрос уже задавали в stakcoverflow раньше: http://stackoverflow.com/questions/1014358/how-can-you-get-the-calling-ip-address- on-an-ejb-call – Ben

+0

Он не работает –

+0

И он для V4.2.2 –

ответ

1

Что я предлагаю, это чистый взлом, но он может работать.

Вы должны получить дамп потока JBoss 4.2.3, пока вы активируете эти удаленные клиенты. Свалка нить выглядит примерно так (пожалуйста, не берите эту тему дамп буквально, его просто образец для вас, чтобы получить представление о том, как нить свалка выглядит)

"Attach Listener" daemon prio=9 tid=7f8624000000 nid=0x10eeed000 waiting on condition [00000000] 

java.lang.Thread.State: RUNNABLE 

    Locked ownable synchronizers: 
    - None 

"ajp-127.0.0.1-8009-Acceptor-0" daemon prio=5 tid=7f863d9c5000 nid=0x119033000 runnable [119032000] 
    java.lang.Thread.State: RUNNABLE 
    at java.net.PlainSocketImpl.socketAccept(Native Method) 
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408) 
    - locked <7b20d3d28> (a java.net.SocksSocketImpl) 
    at java.net.ServerSocket.implAccept(ServerSocket.java:462) 
    at java.net.ServerSocket.accept(ServerSocket.java:430) 
    at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:61) 
    at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:314) 
    at java.lang.Thread.run(Thread.java:680) 

    Locked ownable synchronizers: 
    - None 

"http-127.0.0.1-8080-Acceptor-0" daemon prio=5 tid=7f8633b9f000 nid=0x1187ae000 runnable [1187ad000] 
    java.lang.Thread.State: RUNNABLE 
    at java.net.PlainSocketImpl.socketAccept(Native Method) 
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408) 
    - locked <7b20d3f08> (a java.net.SocksSocketImpl) 
    at java.net.ServerSocket.implAccept(ServerSocket.java:462) 
    at java.net.ServerSocket.accept(ServerSocket.java:430) 
    at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:61) 
    at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:314) 
    at java.lang.Thread.run(Thread.java:680) 

Как вы можете видеть, каждый поток имеет связанный протокол/IP-адрес и более подробную информацию о потоке. Для конкретных потоков RMI вы найдете имя потока, в котором также находится IP-адрес клиента (что-то вроде этого WorkerThread # 0 [192.168.0.108:55208]) Вы можете проанализировать поток «NAME» и извлечь клиентский IP-адрес.

Это довольно хак, потому что имена потоков могут меняться между различными версиями, но для конкретной версии это должно работать.

Настоящая официальная JBoss Wiki [1], которая объясняет пример кода.

Надеюсь, это поможет.

Удачи вам!

[1] https://community.jboss.org/wiki/HowtogettheClientipaddressinanEJB3Interceptor

+1

OP запрашивает IP-адрес клиента, а не IP-адрес сервера. Более того, есть намного более чистые способы получить IP-адрес сервера. – BalusC

+0

JBoss создает новый поток для каждого соединения RMI, и я понимаю, что IP-адрес клиента встроен в имя потока. Я согласен, что это НЕ стандартный или идеальный способ сделать это, НО, как вы упомянули, есть ли лучшие способы поделиться этим с OP. – uaarkoti

+0

BTW, вот официальная Wiki, которая использует именно то, что я предложил. https://community.jboss.org/wiki/HowtogettheClientipaddressinanEJB3Interceptor – uaarkoti

Смежные вопросы