在 EJB 的会话 bean 方法中,我需要知道客户端调用该方法的 IP 地址。是否有可能在 JBoss 4.2.3 中获得这些信息?
问问题
535 次
1 回答
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
于 2012-03-19T17:16:33.383 回答