【问题标题】:Obtaining the IP address of the caller of an EJB method in JBoss 4.2.3在 JBoss 4.2.3 中获取 EJB 方法调用者的 IP 地址
【发布时间】:2012-03-16 06:34:45
【问题描述】:

在 EJB 的会话 bean 方法中,我需要知道客户端调用该方法的 IP 地址。 是否可以在 JBoss 4.2.3 中获取这些信息?

【问题讨论】:

标签: java jakarta-ee jboss jboss-4.2.x


【解决方案1】:

我的建议是纯粹的 hack,但它可能会起作用。

当这些远程客户端处于活动状态时,您应该获得 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。

这是一个 hack,因为线程名称可能会在不同版本之间发生变化,但对于特定版本,这应该可以工作。

这是一个官方的 JBoss Wiki [1],它用示例代码进行了解释。

希望这会有所帮助。

祝你好运!

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

【讨论】:

  • OP 要求的是客户端 IP,而不是服务器 IP。更重要的是,还有更简洁的方法来获取服务器 IP。
  • JBoss 为每个 RMI 连接创建一个新线程,我的理解是客户端 IP 嵌入在线程名称中。我同意这不是一种标准或理想的方式,但正如你所提到的,如果有更好的方式你应该与 OP 分享。
  • 顺便说一句,这是官方 Wiki,它完全使用了我的建议。 community.jboss.org/wiki/…
  • 嗯,但是您显示的那些线程转储是 Web 服务器的,而不是 EJB 客户端的。
  • 我展示的线程转储只是为了获得一个粗略的想法。正如我在第二句“你应该得到一个线程转储......当你有这些 rmi 客户端处于活动状态”中明确指出的那样,以查看线程名称的活动值。这个线程转储不是从字面上理解的。您还提到有更好的方法可以做到这一点,如果您有想法,请发布它们,以便每个人都可以受益。
猜你喜欢
  • 2012-05-10
  • 2010-11-04
  • 2012-10-08
  • 2017-06-02
  • 2010-09-12
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
相关资源
最近更新 更多