在EJB的会话bean方法中,我需要知道客户端调用该方法的IP地址。 是否可以在JBoss 4.2.3中获取此信息?
答案 0 :(得分: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