Java 在JBoss 4.2.3中获取EJB方法调用方的IP地址

Java 在JBoss 4.2.3中获取EJB方法调用方的IP地址,java,jakarta-ee,jboss,jboss-4.2.x,Java,Jakarta Ee,Jboss,Jboss 4.2.x,在EJB的会话bean方法中,我需要知道客户端调用该方法的IP地址。 有可能在JBoss4.2.3中获得这些信息吗?我建议的是一种纯粹的黑客攻击,但它可能会起作用 当这些远程客户端处于活动状态时,您应该获得JBoss 4.2.3的线程转储。线程转储看起来像这样(请不要从字面上理解这个线程转储,它只是一个示例,让您了解线程转储的外观) “附加侦听器”守护程序prio=9 tid=7f862400000 nid=0x10eeed000等待条件[00000000] java.lang.Thread.S

在EJB的会话bean方法中,我需要知道客户端调用该方法的IP地址。
有可能在JBoss4.2.3中获得这些信息吗?

我建议的是一种纯粹的黑客攻击,但它可能会起作用

当这些远程客户端处于活动状态时,您应该获得JBoss 4.2.3的线程转储。线程转储看起来像这样(请不要从字面上理解这个线程转储,它只是一个示例,让您了解线程转储的外观)

“附加侦听器”守护程序prio=9 tid=7f862400000 nid=0x10eeed000等待条件[00000000]
java.lang.Thread.State:可运行
锁定可拥有的同步器:
-没有
“ajp-127.0.0.1-8009-Acceptor-0”守护程序prio=5 tid=7f863d9c5000 nid=0x119033000可运行[119032000]
java.lang.Thread.State:可运行
位于java.net.PlainSocketImpl.socketAccept(本机方法)
在java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
-锁定(一个java.net.socksocketimpl)
位于java.net.ServerSocket.implacpt(ServerSocket.java:462)
位于java.net.ServerSocket.accept(ServerSocket.java:430)
位于org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:61)
位于org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:314)
运行(Thread.java:680)
锁定可拥有的同步器:
-没有
“http-127.0.0.1-8080-Acceptor-0”守护程序prio=5 tid=7f8633b9f000nid=0x1187ae000可运行[1187ad000]
java.lang.Thread.State:可运行
位于java.net.PlainSocketImpl.socketAccept(本机方法)
在java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
-锁定(一个java.net.socksocketimpl)
位于java.net.ServerSocket.implacpt(ServerSocket.java:462)
位于java.net.ServerSocket.accept(ServerSocket.java:430)
位于org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:61)
位于org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:314)
运行(Thread.java:680)
正如您所看到的,每个线程都有一个相关的协议/ip地址和线程的更多细节。对于特定于RMI的线程,您会发现线程名称也包含客户端IP(类似于WorkerThread#0[192.168.0.108:55208]),您可以解析线程“名称”并提取客户端IP

这是一个相当棘手的问题,因为线程名称可能会在不同版本之间更改,但对于特定版本,这应该是可行的

下面是一个官方JBossWiki[1],它用示例代码进行了解释

希望这有帮助

祝你好运


[1]

这是之前在StakCflow中提出的一个问题:OP要求的是客户端IP,而不是服务器IP。更重要的是,有更干净的方法获得服务器IP。JBoss为每个RMI连接创建一个新线程,我的理解是,客户端IP嵌入到线程名称中。我同意这不是一个标准或理想的方法,但正如你提到的,如果有更好的方法,你应该与OP.BTW分享,这里是官方维基,它使用的正是我所建议的。嗯,但是你展示的那些线程转储是web服务器的,而不是EJB客户机的。我展示的线程转储只是为了大致了解一下。正如我在第二句中明确指出的,“当这些rmi客户端处于活动状态时,您应该获得一个线程转储”,以查看线程名称的活动值。这个线程转储不是字面意义上的。你还提到有更好的方法可以做到这一点,如果你有想法,请发布它们,这样每个人都可以受益。
"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)